"void""对象"的非定义声明:C++标准的哪一部分禁止它们?或者是吗?

AnT*_*AnT 5 c++ declaration void language-lawyer incomplete-type

有在C++标准至少两个地方禁止限定对象与不完全类型(http://eel.is/c++draft/basic.def#5,http://eel.is/c++draft/basic .types#5).但是,在C++中通常允许为不完整类型的对象提供非定义声明.而且我似乎无法确定那些禁止void以这种方式声明类型不完整的"对象"的特定部分.(当然,void在一个例子中,它不是C++中的对象类型,但它们都不是引用类型.)所以,就是这样

extern void a;
Run Code Online (Sandbox Code Playgroud)

在C++中真的不合格?

在C void中,允许对象的非定义声明(如上所示),GCC和Clang都接受C代码中的上述内容(当然不允许定义).但在C++代码中,两个编译器都会为此类声明发出错误.标准的哪一部分让他们这样做?

[basic.fundamental]列出了void类型的可能用途(http://eel.is/c++draft/basic.types#basic.fundamental-13),但它似乎并不是一个完整的列表.

Sto*_*ica 7

我相信相关的段落如下:

[dcl.stc]

5extern说明符应只适用于一个变量或函数的声明.

[基本]

6变量是由比非静态数据成员或对象的其他的基准的声明引入.变量的名称(如果有)表示引用或对象.

[basic.types]

8一种对象类型是一个(可能CV修饰)键入不是一个函数式,而不是一个引用类型,而不是CV空隙.

a作为变量声明,必须根据[basic]6表示引用或对象.这涵盖了确实不是对象类型的引用.但是,由于void既不是引用也不是对象类型,因此声明格式不正确.

  • 而且,除此之外,即使该声明不是格式错误,您也永远不会形成它应该声明的定义.那为什么要允许呢? (3认同)