14

这个 C++11 程序格式错误吗?

typedef void& rv;

int main() {}

我在标准中找不到任何禁止它的内容(在 3.9.2 和 8.3.2 中查看)。

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

如果有意的话,我会期望 [dcl.ref]/5 给出这样的限制。

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

4

2 回答 2

16

引用 C++11 标准(强调我的):

8.3.2 参考文献

1 [...] 指定类型“<strong>对 cv void的引用”的声明符格式不正确


作为信息的一个小窍门, N3421greater<>提案(已被接受以包含在未来的 C++14 标准中)利用此规则void作为默认模板参数。

B. 选择使用默认模板参数和显式特化的技术void是因为它的非侵入性。greater<void> 不是有效的 C++11(它会尝试形成对void8.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

于 2013-10-09T02:35:34.357 回答
2

对 a 的引用void表示指向的数据,它没有类型,因此不能以任何有意义的方式引用。

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

于 2013-10-09T02:41:28.673 回答