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

Non-defining declarations for `void` "objects": which part of C++ standard prohibits them? Or does it?

C++ 标准中至少有两个地方禁止定义 类型不完整的对象 (http://eel.is/c++draft/basic.def#5, http://eel.is/c++draft/basic.types#5)。但是,为不完整类型的对象提供 非定义声明 通常在 C++ 中是允许的。而且我似乎无法查明禁止以这种方式声明 void 类型的不完整 "objects" 的特定部分。 (诚​​然,void 不是 C++ 中的对象类型,但举个例子,引用类型也不是。)所以,这是

extern void a;

在 C++ 中真的是病式的吗?

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

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

我认为相关的段落如下:

[dcl.stc]

5 The extern specifier shall be applied only to the declaration of a variable or function.

[basic]

6 A variable is introduced by the declaration of a reference other than a non-static data member or of an object. The variable's name, if any, denotes the reference or object.

[basic.types]

8 An object type is a (possibly cv-qualified) type that is not a function type, not a reference type, and not cv void.

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