c++中将函数名加括号有什么意义么?
本帖最后由 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");
}
完全没看出两种调用方法的区别,
所以有人知道函数名加括号到底有什么意义么? 本帖最后由 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");
}
输出:
宏调用
函数调用
换句话说,就是类函数宏是不能加括号的,而真正的函数是能加括号的 . 同样,函数指针,可调用类,以及lambda表达式都是可以加括号的,
这帖子留着吧,应该还是有人不知道的
页:
[1]