这个 C++11 程序格式错误吗?
typedef void& rv;
int main() {}
我在标准中找不到任何禁止它的内容(在 3.9.2 和 8.3.2 中查看)。
Clang 说“不能形成对 'void' 的引用”,gcc 说“不能声明对 'void' 的引用”
如果有意的话,我会期望 [dcl.ref]/5 给出这样的限制。
实现是否只是“在字里行间阅读”,因为这样的类型永远不能在对象定义中使用?
引用 C++11 标准(强调我的):
8.3.2 参考文献
1 [...] 指定类型“<strong>对 cv void的引用”的声明符格式不正确。
作为信息的一个小窍门, N3421greater<>
提案(已被接受以包含在未来的 C++14 标准中)利用此规则void
作为默认模板参数。
B. 选择使用默认模板参数和显式特化的技术
void
是因为它的非侵入性。greater<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
最重要的是,请记住,引用只是其他对象的别名,您不能拥有 type 的对象void
。
对 a 的引用void
表示指向的数据,它没有类型,因此不能以任何有意义的方式引用。
引用是对某种类型的实例的引用,它不能是 type void
。