什么是"void();" 在C++中作为单独的声明意味着什么?

Ale*_*lex 5 c++

这个程序如何编译好?

int main() {
    void();  // Does this create a "void" object here?
}
Run Code Online (Sandbox Code Playgroud)

我已经在MSVC和GCC下进行了测试.但这void是一个不完整的类型.对任何其他不完整的用户定义类型执行相同操作时,

class Incomplete;

int main() {
    Incomplete();  // Error saying "Incomplete" is incomplete.
}
Run Code Online (Sandbox Code Playgroud)

chr*_*ris 11

C++11§5.2.3[expr.type.conv]/2详细介绍(强调我的):

表达式T(),其中T是非数组完整对象类型的简单类型说明符或类型名称说明符,或者(可能是cv限定的)void类型,创建指定类型的prvalue,其值为通过值初始化(8.5)生成类型为T的对象; 没有为void()情况进行初始化.

它只是一个类型的prvalue void.没有特殊的初始化或任何类似的东西int().prvalue就像true,或nullptr,或2.表达式相当于2;,而void不是代替int.


AnT*_*AnT 3

void类型一直都是特殊的。它确实是不完整的,但在许多通常需要完整类型的上下文中是允许的。否则,例如,void函数的定义将因void类型不完整而无效。还可以编写void类型表达式(对void函数的任何调用都是此类表达式的示例)。

即使在 C 语言中,您也可以使用void类型的立即表达式,例如(void) 0. 您的代码中的内容只是 C++ 特定语法的示例,其本质上执行相同的操作:它生成类型为 的无操作表达式void