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

时间:2016-06-08 11:10:09

标签: c++ c++11

我有以下typedef:

using int_ref = int&&;

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

std::cout << is_same< int_ref, int_ref&& >::value; // prints 1

我希望int_ref&&扩展到int&& &&,这显然是不可能的。我错过了什么吗?

1 个答案:

答案 0 :(得分:28)

这是由于reference collapsing rules

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

A& & -> A&
A& && -> A&
A&& & -> A&
A&& && -> A&&

在您的情况下,int_refint&&,因此int&& &&变为int&&

相关标准报价:

  

(N3337) [dcl.ref]/6:如果是typedef(7.1.3),类型为 template-parameter (14.3.1),或者是 decltype-specifier (7.1。 6.2)表示类型TR   这是对类型T的引用,尝试创建类型“对 cv TR的左值引用”会创建类型   “左值引用T”,而尝试创建“ cv TR的右值引用”会创建类型TR