我正在寻找标准中对这一事实的正式解释.我已经找到了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)
它工作正常
它不能在void类型上完成
#include <iostream>
#include <cstring>
using namespace std;
extern void f; //compile-time error
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*igt 24
您不能声明类型的变量,void
因为变量必须具有对象类型或是引用,extern void f;
不声明引用,并且void
不是对象类型:
第3节[basic]
说
甲变量是由比非静态数据成员或对象的其他的基准的声明引入.
第3.9节[basic.types]
说明了这一点
一个对象类型是一个(可能CV-合格)型不是一个函数式,而不是一个引用类型,而不是一个
void
类型.
"void类型是一个不完整的类型"
您无法创建任何不完整类型的变量
"......无法完成"
虽然您的extern
不完整struct 的示例可以在稍后完成,但编译器知道任何类型的声明void
都无法完成.