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

时间:2014-09-14 16:17:58

标签: c++

这个程序如何编译好?

int main() {
    void();  // Does this create a "void" object here?
}

我在MSVC和GCC下都进行了测试。但void是一种不完整的类型。对任何其他未完成的用户定义类型执行相同操作时,

class Incomplete;

int main() {
    Incomplete();  // Error saying "Incomplete" is incomplete.
}

3 个答案:

答案 0 :(得分:11)

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

  

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

它只是void类型的prvalue。没有特殊的初始化或int()之类的东西。 prvalue类似于truenullptr2。表达式相当于2;,但void代替int

答案 1 :(得分:3)

void类型一直很特别。它确实是不完整的,但在许多情况下都允许使用完整类型。否则,举例来说,由于void类型的不完整性,void函数的定义将无效。也可以编写void类型的表达式(对void函数的任何调用都是这种表达式的一个例子。)

即使在C语言中,您也可以使用void类型的直接表达式,例如(void) 0。你在代码中拥有的只是C ++特定语法的一个例子,它基本上做同样的事情:它产生一个类型为void的无操作表达式。

答案 2 :(得分:2)

允许在C ++中构造void类型可以用作模板参数。