我有以下typedef:
using int_ref = int&&;
为什么以下代码不会产生错误(或打印false
)?
std::cout << is_same< int_ref, int_ref&& >::value; // prints 1
我希望int_ref&&
扩展到int&& &&
,这显然是不可能的。我错过了什么吗?
答案 0 :(得分:28)
这是由于reference collapsing rules。
基本上,虽然您不能自己编写对引用的引用,但在某些情况下(typedef,template parameters,decltypes),您可以添加创建引用类型的引用,该引用类型将按如下方式折叠:
A& & -> A&
A& && -> A&
A&& & -> A&
A&& && -> A&&
在您的情况下,int_ref
为int&&
,因此int&& &&
变为int&&
。
相关标准报价:
(N3337) [dcl.ref]/6:
如果是typedef(7.1.3),类型为 template-parameter (14.3.1),或者是 decltype-specifier (7.1。 6.2)表示类型TR
这是对类型T
的引用,尝试创建类型“对 cvTR
的左值引用”会创建类型 “左值引用T
”,而尝试创建“ cvTR
的右值引用”会创建类型TR
。