我有以下类型定义:
using int_ref = int&&;
为什么以下代码不会产生错误(或打印
false
)?
std::cout << is_same< int_ref, int_ref&& >::value; // prints 1
我希望
int_ref&&
扩展到int&& &&
,这显然是不可能的。我是不是错过了什么?
这是由于参考折叠规则。
基本上,虽然你不能自己编写对引用的引用,但在某些情况下(typedef、模板参数、decltypes)你可以添加创建对引用类型的引用,其折叠如下:
A& & -> A&
A& && -> A&
A&& & -> A&
A&& && -> A&&
在您的情况下,
int_ref
是int&&
,所以int&& &&
变成int&&
。
相关标准报价:
如果 typedef (7.1.3)、类型 template-parameter (14.3.1) 或 decltype-specifier (7.1.6.2) 表示类型(N3337) [dcl.ref]/6:
这是对类型TR
的引用,尝试创建类型“对 cvT
的左值引用”会创建该类型 “对TR
的左值引用”,而尝试创建类型“对 cvT
的右值引用”会创建类型TR
。TR