将xvalue表示为左值的有效性
Validity of presenting an xvalue as an lvalue
下面的函数(在我的意图中(是获取一个右值,并将其作为左值呈现。
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。
相关文章:
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 如何检查类中共享指针的有效性?
- 列表的有效性在插入后开始迭代器
- "xvalue has identity"是什么意思?
- 现代C ++,对xValue的理解
- lambda 函数返回值的有效性
- 提升图形库:以高性能的方式检查vertex_descriptor的有效性
- 没有迭代器失效是否意味着推进迭代器的有效性?
- XVALUE来自类成员访问表达式
- 运算符返回的指针的有效性 >
- QUdpSocket 失去有效性
- QTreeWidgetItem 析构函数和 QTreeWidgetItemIterator 有效性
- 模板化代码的有效性是什么意思
- 为什么函数调用是xvalue(如果返回类型为rvalue)
- C++11: "decltype(1+2)"声明 xvalue 还是 prvalue?
- 如何定义xvalue混合类别
- std::move() and xvalue in C++
- 屏障的有效性如何 原子写入后跟同一变量的原子读取?
- xvalue上的下标的值类别
- 检查2D阵列中的有效性