为什么在将 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 拒绝第一个例子是错误的。
有人可以解释为什么两个编译器都在第二个示例中抛出错误,而只有 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 expressionv
to typeT
. IfT
is an lvalue reference type or an rvalue reference to function type, the result is an lvalue; [...] Conversions that can be performed explicitly usingreinterpret_cast
are listed below. No other conversion can be performed explicitly usingreinterpret_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 拒绝第一个例子是错误的。