为什么添加对右值引用的引用而不是错误?

tob*_*spr 15 c++ c++11

我有以下typedef:

using int_ref = int&&;
Run Code Online (Sandbox Code Playgroud)

为什么以下代码不会产生错误(或打印false)?

std::cout << is_same< int_ref, int_ref&& >::value; // prints 1
Run Code Online (Sandbox Code Playgroud)

我希望这int_ref&&会扩大到int&& &&显然是不可能的.我错过了什么吗?

Tar*_*ama 28

这是由于参考折叠规则.

基本上,虽然您不能自己编写对引用的引用,但在某些情况下(typedef,template parameters,decltypes),您可以添加创建对引用类型的引用,该引用类型将按如下方式折叠:

A& & -> A&
A& && -> A&
A&& & -> A&
A&& && -> A&&
Run Code Online (Sandbox Code Playgroud)

在你的情况下,int_refint&&,int&& &&成为int&&.


相关标准报价:

(N3337) [dcl.ref]/6:如果typedef(7.1.3),类型模板参数(14.3.1)或decltype-specifier(7.1.6.2)表示作为类型TR 引用的类型T,则尝试创建类型"左值引用" to cv TR "创建类型"左值引用T",而尝试创建类型"rvalue引用cv TR "创建类型TR.

  • @tobspr当然,补充道 (2认同)