gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:03:34 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





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

(3 个回答)


9 个月前关闭。




有人可以解释为什么两个编译器都在第二个示例中抛出错误而只有 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.


后面的任何条款都不允许 reinterpret_cast来自不是指针的 (p)rvalue。
#include <memory>
reinterpret_cast<int&>(std::move(10));
此处,要转换的表达式是 xvalue,如链接到 in a comment by @LanguageLawyer 的问答中所示(这可以说是此问答的欺骗目标)
  • 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 shouldallow a glvalue operand when the target is an rvalue referencetype.

    [...]


    请注意,强调段建议仅当目标是右值引用时才允许这样做,但实际更新的 [expr.reinterpret.cast]/11取消了这个限制。
    因此,GCC 拒绝第一个例子是错误的。

    关于c++ - 将 xvalue 转换为非常量左值引用时,为什么 gcc 和 clang 中的编译器错误不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64892562/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com