以下C++代码什么都不做(使用GCC 4.4.3) - 它不打印文本:
struct MyStruct { MyStruct() { cout << "Hello" << endl; } };
void foo() {
MyStruct ();
}
Run Code Online (Sandbox Code Playgroud)
我认为这不是那么明显......更不用说忘记给出变量名的危险了.是否有编译器选项/警告禁止编译此类代码或允许它背后有任何隐藏的秘密?
编辑:对不起.上面的版本实际MyStruct();打印.不打印的版本是:
void bar() {
MyStruct a();
}
Run Code Online (Sandbox Code Playgroud)
所以现在我有点困惑.
这不是声明,因为在MyStruct ();,MyStruct它将是decl-specifier-seq的一部分并在其中形成一个类型名称.然后()只能是一个函数声明器.这要求指定一个declarator-id,在你的情况下不是.需要一种特殊的语法形式来允许这样的语法来声明构造函数.但是这样的语法异常不是在声明语句中做出的.
所以这个结构不能是一个声明.它被解析为一个表达式,它指定一个创建临时类型的功能强制转换MyStruct.
如果编译器没有打印Hello,则它不符合要求,或者您没有foo在程序中调用.
您的编辑也没有指定没有名称的声明.相反,它指定了一个声明,表明确实有一个名称.它声明了一个被调用的函数a.编译器无法通过此方式表达其他内容.
MyStruct a();
Run Code Online (Sandbox Code Playgroud)
它可以通过在稍后发现代码中的错误(如下所示)中使用恢复规则来推断这一点
a.f();
Run Code Online (Sandbox Code Playgroud)
如果你的代码中有这个试图调用成员函数并且"a"是一个函数,编译器可以检查是否MyStruct包含一个成员f,使得这个表达式格式正确.但是,如果你忘了放括号怎么办?MyStruct假设适当声明的成员,以下内容对于返回a的上述声明函数有效f.
a().f();
Run Code Online (Sandbox Code Playgroud)
所以实际上,编译器无法真正知道你的意思.