鱼C论坛

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

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

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

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

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

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

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

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

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

        _NODISCARD static constexpr _Ty epsilon() noexcept
        {        // return smallest effective increment from 1.0
                return (_Ty());
        }

        ...
};
(出自limits)

发现numeric_limits的成员函数min和max都单独加上了括号,而其他的成员函数比如lowest等并没有,
而且其他代码,在引用它的时候,也带上了括号:
template<class _Rep>
_INLINE_VAR constexpr bool treat_as_floating_point_v = treat_as_floating_point<_Rep>::value;

// STRUCT TEMPLATE duration_values
template<class _Rep>
struct duration_values
{        // gets arithmetic properties of a type
        _NODISCARD static constexpr _Rep zero() noexcept 
        {        // get zero value
                return (_Rep(0));
        }

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

        _NODISCARD static constexpr _Rep(max)() noexcept 
        {        // get largest value
                return ((numeric_limits<_Rep>::max)());    //调用max的时候,有括号
        }
};
(出自chrono)

最先我的想法是,是不是跟min,max宏太常用有关系。但是函数名加不加括号完全不影响宏的调用。
然后又试了一下:
struct t {
        t() {
                cout << "hello world" << endl;
        }
};
int main() {
        numeric_limits<t>::max();
        (numeric_limits<t>::max)();
        system("pause");
}
完全没看出两种调用方法的区别,

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

使用道具 举报

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

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

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

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

int main() {
        func(1);
        (func)(1);
        system("pause");
}

输出:
宏调用
函数调用

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

评分

参与人数 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-10-5 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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