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

Why is adding a reference to a rvalue reference not an error?

本文关键字:引用 错误 添加 为什么      更新时间:2023-10-16

我有以下类型定义:

using int_ref = int&&;

为什么下面的代码没有产生错误(或打印false)?

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

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

这是由于引用折叠规则。

基本上,虽然你不能自己编写对引用的引用,但在某些情况下(typedefs、模板参数、decltypes),你可以添加对引用类型的创建引用,该引用折叠如下:

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

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


相关标准报价:

(N3337) [dcl.ref]/6: 如果 typedef (7.1.3)、类型模板参数 (14.3.1) 或 decltype-specifier (7.1.6.2) 表示类型TR 即对类型T的引用,尝试创建类型"对 cv TR的左值引用"创建类型 "对T的左值引用",而尝试创建类型"对 cv TR的右值引用"创建类型 TR