为什么我们不能声明void类型的变量?

38 c++ void language-lawyer

我正在寻找标准中对这一事实的正式解释.我已经找到了3.9.1/9所说的内容并尝试用该部分作出解释.

第3.9.1/9节,N3797:

void类型具有一组空值.void类型是不完整的类型,无法完成.它用作不返回值的函数的返回类型.任何表达式都可以显式转换为cv void(5.4)类型.void类型的表达式只能用作表达式语句(6.2),作为逗号表达式(5.18)的操作数,作为?:( 5.16)的第二个或第三个操作数,作为typeid,noexcept或者操作数的操作数. decltype,作为返回类型为void的函数的返回语句(6.6.3)中的表达式,或者作为显式转换为类型cv void的操作数.

我不明白它是如何暗示void类型有一组空的值?

假设类型T具有一组空值.为什么编译器在遇到以下行时会抛出错误:

extern T v; 
Run Code Online (Sandbox Code Playgroud)

我们可以通过以下方式对不完整类型的变量进行decalre:

#include <iostream>
#include <cstring>

using namespace std;

struct Foo;

extern Foo f; //OK!

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

它工作正常

DEMO

它不能在void类型上完成

#include <iostream>
#include <cstring>

using namespace std;

extern void f; //compile-time error

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

DEMO

Ben*_*igt 24

您不能声明类型的变量,void因为变量必须具有对象类型或是引用,extern void f;不声明引用,并且void不是对象类型:

第3节[basic]

变量是由比非静态数据成员或对象的其他的基准的声明引入.

第3.9节[basic.types]说明了这一点

一个对象类型是一个(可能CV-合格)型不是一个函数式,而不是一个引用类型,而不是一个void类型.


Iro*_*san 9

"void类型是一个不完整的类型"

您无法创建任何不完整类型的变量

"......无法完成"

虽然您的extern不完整struct 的示例可以在稍后完成,但编译器知道任何类型的声明void都无法完成.

  • 我们不能_define_一个不完整类型的对象,但可以**声明**这种类型的变量.http://coliru.stacked-crooked.com/a/55b2c751ba86478f (2认同)
  • 请注意,该帖子不是我正在寻找的答案.因为我询问了宣言,而不是定义.不完整类型的对象定义被3.9/5拒绝. (2认同)