在C++ 20规范中,哪里有规则说右值引用不能绑定到左值?

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

当然,这不会编译:

struct X {};
X&& x = X();
X&& x2 = x; // error: rvalue reference to type 'X' cannot bind to lvalue of type 'X'

C++20规范中与此相关的规则在哪里?

我阅读了“9.4.3 参考”部分,但找不到规则(我是 C++ 规范的新手)。

作为旁注,我也找不到允许以下最后一行的规则(也许找到它将有助于解决主要问题):

X x3;
X& x4 = x3;
X& x5 = x4;
c++ language-lawyer rvalue-reference
1个回答
0
投票

正如 François Andrieux 和 User17732522 所评论的,关键点是解释声明的初始化表达式的类型。

9.4.3 的规则(5)说:

对类型“cv1 T1”的引用由类型“cv2 T2”的表达式初始化,如下所示:

解释“T2 类型的表达式”时,应用 7.2.2 的规则 (1):

如果表达式最初具有“对 T 的引用”类型(9.3.3.2、9.4.3),则在之前将类型调整为 T 任何进一步的分析。 ...

因此,当将 9.4.3 的规则(5)应用于

X&& x2 = x;
时,T1 为
X
,T2 也为
X
。由于 T1 和 T2 是同一类型,因此 T1 与 T2 相似,并且 T1 与 T2 是引用相关的。这满足 9.4.3 的规则 (5.4.4) 的条件,即:

... - 如果引用是右值引用,则初始化表达式不应是左值。

因此,语法不允许

X&& x = X(); X&& x2 = x;
,因为初始化表达式
x
是左值。

在第二个示例中,语法通过应用 9.4.3 的规则 (5.1) 来允许

X& x4 = x3; X& x5 = x4;

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