鱼C论坛

 找回密码
 立即注册
查看: 2065|回复: 2

c++中将函数名加括号有什么意义么?

[复制链接]
发表于 2019-12-6 05:26:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Croper 于 2019-12-6 06:08 编辑

今天翻c++标准库的时候,看到一段代码:
  1. template<class _Ty>
  2. class numeric_limits
  3.         : public _Num_base
  4. {        // numeric limits for arbitrary type _Ty (say little or nothing)
  5. public:
  6.         _NODISCARD static constexpr _Ty(min)() noexcept   //min作为函数名,单独加了括号
  7.         {        // return minimum value
  8.                 return (_Ty());
  9.         }

  10.         _NODISCARD static constexpr _Ty(max)() noexcept  //max作为函数名,单独加了括号
  11.         {        // return maximum value
  12.                 return (_Ty());
  13.         }

  14.         _NODISCARD static constexpr _Ty lowest() noexcept  //lowest作为函数名,没有加括号
  15.         {        // return most negative value
  16.                 return (_Ty());
  17.         }

  18.         _NODISCARD static constexpr _Ty epsilon() noexcept
  19.         {        // return smallest effective increment from 1.0
  20.                 return (_Ty());
  21.         }

  22.         ...
  23. };
复制代码
(出自limits)

发现numeric_limits的成员函数min和max都单独加上了括号,而其他的成员函数比如lowest等并没有,
而且其他代码,在引用它的时候,也带上了括号:

  1. template<class _Rep>
  2. _INLINE_VAR constexpr bool treat_as_floating_point_v = treat_as_floating_point<_Rep>::value;

  3. // STRUCT TEMPLATE duration_values
  4. template<class _Rep>
  5. struct duration_values
  6. {        // gets arithmetic properties of a type
  7.         _NODISCARD static constexpr _Rep zero() noexcept
  8.         {        // get zero value
  9.                 return (_Rep(0));
  10.         }

  11.         _NODISCARD static constexpr _Rep(min)() noexcept
  12.         {        // get smallest value
  13.                 return (numeric_limits<_Rep>::lowest());   //调用lowest的时候,无括号
  14.         }

  15.         _NODISCARD static constexpr _Rep(max)() noexcept
  16.         {        // get largest value
  17.                 return ((numeric_limits<_Rep>::max)());    //调用max的时候,有括号
  18.         }
  19. };
复制代码
(出自chrono)

最先我的想法是,是不是跟min,max宏太常用有关系。但是函数名加不加括号完全不影响宏的调用。
然后又试了一下:

  1. struct t {
  2.         t() {
  3.                 cout << "hello world" << endl;
  4.         }
  5. };
  6. int main() {
  7.         numeric_limits<t>::max();
  8.         (numeric_limits<t>::max)();
  9.         system("pause");
  10. }
复制代码

完全没看出两种调用方法的区别,

所以有人知道函数名加括号到底有什么意义么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-6 05:38:17 | 显示全部楼层
本帖最后由 Croper 于 2019-12-6 05:42 编辑

不好意思,才发帖两分钟就发现了,
我之前把宏放在函数名前面了,是我疏忽了...

结果是确实是宏的影响:
  1. void func(int a) {
  2.         cout << "函数调用" << endl;
  3. }

  4. #define func(a) cout<<"宏调用"<<endl;

  5. int main() {
  6.         func(1);
  7.         (func)(1);
  8.         system("pause");
  9. }
复制代码


输出:
  1. 宏调用
  2. 函数调用
复制代码


换句话说,就是类函数宏是不能加括号的,而真正的函数是能加括号的        .

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-6 06:08:26 | 显示全部楼层
同样,函数指针,可调用类,以及lambda表达式都是可以加括号的,

这帖子留着吧,应该还是有人不知道的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 23:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表