我有以下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_ref是int&&,int&& &&成为int&&.
相关标准报价:
(N3337) [dcl.ref]/6:如果typedef(7.1.3),类型模板参数(14.3.1)或decltype-specifier(7.1.6.2)表示作为类型TR引用的类型T,则尝试创建类型"左值引用" to cvTR"创建类型"左值引用T",而尝试创建类型"rvalue引用cvTR"创建类型TR.
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |