由于int()
和int{}
是值等于的常量0
表达式,我认为它们是等价且可互换的,因此编译器必须平等对待它们。例如,
int a[0]; //error: zero-sized array not allowed in ISO C++
int b[int()]; //error: zero-sized array not allowed in ISO C++
int c[int{}]; //error: zero-sized array not allowed in ISO C++
但似乎在某些极端情况下它们不可互换。
初始化指针时:
int *p = 0; //ok int *q = int(); //error - by clang only int *r = int{}; //error - by gcc and clang both
请参阅GCC和Clang消息。我怀疑这是两个编译器中的一个错误,因为我希望它们在这种情况下可以互换,但我很高兴被证明是错误的。:-)
传递给类模板时:
template<int N> struct X{}; X<0> x1; //ok X<int{}> x2; //ok (same as X<0>) X<int()> x3; //error
我发现语法
X<int()>
非常熟悉,因为我以前见过(并且可能使用过)类似的语法,例如在 中std::function<int()>
,模板参数int()
应该是函数类型 (而不是0
),不带参数并返回int
。但是我想知道规范中在这种情况下所说的部分int()
将被视为函数类型并且不等同于int{}
which is always0
。