C++ C++;11:提及无效?

C++ C++;11:提及无效?,c++,c++11,C++,C++11,这是C++11程序格式错误吗 typedef void& rv; int main() {} 我在标准中找不到任何不允许它的内容(参见3.9.2和8.3.2) Clang说“不能形成对‘void’的引用”,gcc说“不能声明对‘void’的引用” 我本来希望[dcl.ref]/5给出这样一个限制,如果它是有意的话 这些实现是否只是“在字里行间阅读”,因为这样的类型永远不能在对象定义中使用?引用C++11标准(emphasis mine): 8.3.2参考资料 1[…]指定类型的声明符

这是C++11程序格式错误吗

typedef void& rv;

int main() {}
我在标准中找不到任何不允许它的内容(参见3.9.2和8.3.2)

Clang说“不能形成对‘void’的引用”,gcc说“不能声明对‘void’的引用”

我本来希望[dcl.ref]/5给出这样一个限制,如果它是有意的话


这些实现是否只是“在字里行间阅读”,因为这样的类型永远不能在对象定义中使用?

引用C++11标准(emphasis mine):

8.3.2参考资料 1[…]指定类型的声明符 “引用cvvoid”是格式错误的


作为附带的信息,此规则已被(已被接受包含在未来的C++14标准中)利用,将
void
作为默认模板参数

B.使用默认模板参数和显式 为
void
选择专门化是因为其非侵入性<代码>较大值 无效的C++11(它将尝试形成对
void
的引用,被禁止 8.3.2[dcl.ref]/1)。此外,虽然允许用户专门化 标准库机制(17.6.4.2.1[namespace.std]/1),如专门化 必须包含用户定义的类型


也许我只是沉溺于这些智力游戏中,但是为了解释为什么这个规则被强制执行——我必须说这只是我自己的拙见——考虑下面的代码:

sizeof(double&);   // Results in double's size

using foo_ref = foo&;
sizeof(foo_ref);   // Results in foo's size

sizeof(void);      // Error! void has no size!
sizeof(void&);     // Error! Tries to get the size of void

最重要的是,请记住,引用只是其他对象的别名,不能有类型为
void
的对象。对
void
的引用意味着指向的数据没有类型,因此无法以任何有意义的方式引用它


引用是对某种类型的实例的引用,它不能是
void

类型,它隐藏在一个示例和一个注释之后,呵呵。谢谢。关于基本原理:记住这是可以的
structc;typedef C&r。即使
sizeof(C)
sizeof(C&)
格式不正确。我们说
C
void
是未完全定义的类型。([basic.types]/5)。不同之处在于,
C
可以稍后在翻译单元中完成,而
void
则永远无法完成。因此,
对void的引用
永远无法初始化,因此它实际上不是一种有用的类型。