将xvalue表示为左值的有效性

Validity of presenting an xvalue as an lvalue

本文关键字:有效性 xvalue 表示      更新时间:2024-05-10

下面的函数(在我的意图中(是获取一个右值,并将其作为左值呈现。

auto constexpr RtoL = [](auto&& r) -> decltype(auto) {
static_assert(std::is_rvalue_reference_v<decltype(r)>, "Gimme rvalues, not lvalues.");
return (r);
};

我想在我可以保证xvalue没有真正从中移动的情况下使用它(例如,它通过std::move被强制转换为rvalue,但没有任何东西利用这一点(,所以我用xvalues而不是prvalues来调用它。

不管怎样,编译器(好吧,GCC的版本(似乎对上面代码的有效性有不同的意见。具体来说,考虑到这种用法:

int main() {
int x{3};
RtoL(std::move(x));
}

GCC 11.2认为无效:

<source>:9:14: error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
9 |     return (r);
|              ^

而GCC 10.3和其他编译器认为它是有效的。

此外,更改的返回语句

return (r);

return static_cast<decltype(r)&>(r);

让他们一致认为代码是正确的。

从标准的角度来看,真相在哪里?

这是GCC过去版本中的一个错误(由评论者@Enlico定位(

GCC 12.2版修复了该错误,但GCC 11.3版仍然存在。它可能也会在GCC 11.4中得到修正。

请参阅GodBolt