为什么在将 xvalue 转换为非常量左值引用时 gcc 和 clang 中的编译器错误不一致?

Why are the compiler errors inconsistent in gcc and clang when casting an xvalue to a non-const lvalue reference?

有人可以解释为什么两个编译器都在第二个示例中抛出错误,而只有 gcc 在第一个示例中抛出错误吗?它是否与 static_cast 是 xvalue 的结果有某种关系?

int& example1 = reinterpret_cast<int&>(static_cast<int&&>(10));
//(gcc 10.2) error: invalid cast of an rvalue expression of type 'int' to type 'int&'
//(clang 11.0.0) no errors

int& example2 = reinterpret_cast<int&>(10);
//(gcc 10.2) error: invalid cast of an rvalue expression of type 'int' to type 'int&'
//(clang 11.0.0) error: reinterpret_cast from rvalue to reference type 'int &'

我也不确定,但我认为第一个示例的格式正确,因为根据标准,xvalue 是一种 glvalue,对吗?标准的 [expr.reinterpret.cast]/11 部分说我应该能够将 T1 泛左值转换为“对 T2 的引用”类型,在这种情况下 T1 与 T2 的类型相同。

reinterpret_cast<int&>(10);

此程序格式错误,因为要转换的表达式是纯右值。来自 [expr.reinterpret.cast]/1:

The result of the expression reinterpret_­cast<T>(v) is the result of converting the expression v to type T. If T is an lvalue reference type or an rvalue reference to function type, the result is an lvalue; [...] Conversions that can be performed explicitly using reinterpret_­cast are listed below. No other conversion can be performed explicitly using reinterpret_­cast.

None 后面的子句允许 reinterpret_cast 来自不是指针的 (p)rvalue。


#include <memory>
reinterpret_cast<int&>(std::move(10));

在这里,被转换的表达式是一个 xvalue,如链接到 的问答所示(可以说是此问答的欺骗目标)

  • Can reinterpret_cast (or any cast) convert xvalues to lvalues?

从 C++14(也更新为 C++11 的 DR 修复)和 的实际实现 CWG 1268 :

1268. reinterpret_cast of an xvalue operand Section: 8.2.10 [expr.reinterpret.cast]

Status: CD3

Submitter: Michael Wong

Date: 2011-03-21

[Moved to DR at the October, 2012 meeting.]

8.2.10 [expr.reinterpret.cast] paragraph 11, dealing with casting to reference types, only allows an lvalue operand. Presumably it should allow a glvalue operand when the target is an rvalue reference type.

[...]

请注意,强调的部分建议仅当目标是右值引用时才允许这样做,但实际更新的 [expr.reinterpret.cast]/11 删除了此限制。

因此,GCC 拒绝第一个例子是错误的。