为什么添加对右值引用的引用不是错误? [重复]

问题描述 投票:0回答:1

我有以下类型定义:

using int_ref = int&&;

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

false
)?

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

我希望

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

c++ c++11 reference language-lawyer reference-collapsing
1个回答
28
投票

这是由于参考折叠规则

基本上,虽然你不能自己编写对引用的引用,但在某些情况下(typedef、模板参数、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
的引用,尝试创建类型“对 cv
TR
的左值引用”会创建该类型 “对
T
的左值引用”,而尝试创建类型“对 cv
TR
的右值引用”会创建类型
TR

© www.soinside.com 2019 - 2024. All rights reserved.