原题是这样:有如下代码,则编译时会产生错误的是语句几?
struct Test
{
Test(int) {}
Test() {}
void fun() {}
};
int main()
{
Test a(1); // 语句1
a.fun(); // 语句2
Test b(); // 语句3
b.fun(); // 语句4
return 0;
}
先报答案,这是我用 clang++ 编译后的输出信息:
第二条警告信息是:empty parentheses interpreted as a function declaration
意思是编译器将 Test b(); 理解成了一个返回值为 Test,参数为 void 的函数声明式。
而第三条警告信息又提示我们去掉 b 后面的括号,这样编译器就会将它识别为了个变量定义。
针对这种情况标准中有特别说明:
ISO C++11 8.5
10 An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.
[ Note: Since () is not permitted by the syntax for initializer,
X a();
is not the declaration of an object of class X, but the declaration of a function taking no argument and
returning an X. The form () is permitted in certain other initialization contexts (5.3.4, 5.2.3, 12.6.2). —end note ]
相关参考: