这个程序如何编译好?
int main() {
void(); // Does this create a "void" object here?
}
我在MSVC和GCC下都进行了测试。但void
是一种不完整的类型。对任何其他未完成的用户定义类型执行相同操作时,
class Incomplete;
int main() {
Incomplete(); // Error saying "Incomplete" is incomplete.
}
答案 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类似于true
,nullptr
或2
。表达式相当于2;
,但void
代替int
。
答案 1 :(得分:3)
void
类型一直很特别。它确实是不完整的,但在许多情况下都允许使用完整类型。否则,举例来说,由于void
类型的不完整性,void
函数的定义将无效。也可以编写void
类型的表达式(对void
函数的任何调用都是这种表达式的一个例子。)
即使在C语言中,您也可以使用void
类型的直接表达式,例如(void) 0
。你在代码中拥有的只是C ++特定语法的一个例子,它基本上做同样的事情:它产生一个类型为void
的无操作表达式。
答案 2 :(得分:2)
允许在C ++中构造void类型可以用作模板参数。