gpt4 book ai didi

c++ - 为什么编译器不警告没有名称的定义?

转载 作者:太空狗 更新时间:2023-10-29 19:41:06 28 4
gpt4 key购买 nike

以下 C++ 代码什么都不做(使用 GCC 4.4.3)——它不打印文本:

struct MyStruct { MyStruct() { cout << "Hello" << endl; } };

void foo() {
MyStruct ();
}

我认为这不是那么明显......更不用说忘记给变量名的危险了。是否有禁止编译此类代码的编译器选项/警告,或者是否有任何隐藏的 secret 允许它?

编辑:对不起。 MyStruct(); 上面的版本准确地打印出来了。未打印的版本是:

void bar() {
MyStruct a();
}

所以现在我有点困惑。

最佳答案

这不是声明,因为在 MyStruct (); 中,MyStruct 将是 decl-specifier-seq 的一部分,并且在其中形成一个类型名称。然后 () 只能是一个函数声明符。这需要指定一个 declarator-id,但在您的情况下不是。需要一种特殊的语法形式来允许在声明构造函数时使用这种语法。但是这样的句法异常不是在声明语句中进行的。

所以这个构造不能是一个声明。它被解析为一个表达式,该表达式指定一个函数转换,创建一个 MyStruct 类型的临时对象。

如果编译器不打印 Hello 它要么不符合要求,要么您没有在程序中调用 foo


您的编辑也没有指定没有名称的声明。相反,它指定了一个确实有名称的声明。它声明了一个名为a 的函数。编译器无法理解您的意思。

MyStruct a();

当它后来发现您的代码中的错误时,它可以通过恢复规则努力推断出这一点,如下所示

a.f();

如果你的代码中有这个来尝试调用一个成员函数,而“a”是一个函数,编译器会检查 MyStruct 是否包含一个成员 f 这样这个表达式是合式的。但是,如果您只是忘记放置括号怎么办?以下内容对于上面声明的返回 MyStruct 的函数是有效的,假设有一个适当声明的成员 f

a().f();

所以实际上,编译器无法真正理解你的意思。

关于c++ - 为什么编译器不警告没有名称的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3841552/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com