c++23 断不动吗

sp2*_*nny 5 c++ language-lawyer c++23

标准中有关隐式移动的措辞在 c++23 中发生了变化,
请参阅https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2266r3.html
相关部分是:

返回的符合移动条件的 id 表达式始终是 xvalue

这似乎打破了流行但不明智的“不动”

template<typename T>
auto unmove(T&& v) -> std::remove_reference_t<T>& { return v; }
Run Code Online (Sandbox Code Playgroud)

当前的实现似乎同意:https ://godbolt.org/z/3n39rGM7b

这个重大改变是有意为之的,还是我们可以期待灾难恢复?

cpp*_*ner 9

由于 P2266R3 的实施体验部分提到了这种破坏,所以我认为这显然是故意的。

修复方法很简单:只需添加显式强制转换即可。

template<typename T>
auto unmove(T&& v) -> std::remove_reference_t<T>& {
    return static_cast<std::remove_reference_t<T>&>(v);
}
Run Code Online (Sandbox Code Playgroud)

  • `remove_reference_t&lt;T&gt;&amp;` 是一个很长的拼写 `T&amp;` 的方法:-) (5认同)