(c++23 隐式移动)将移动的本地存储变量作为仅带括号的右值引用返回?

(c++23 implicit move) Returning the moved local storage variable as an rvalue ref with only parenthesisses?

关于“更简单的隐式移动”提案 (P2266R1),我不确定我是否正确理解了这个新的“符合移动条件”的内容。

如有不妥请更正:
[LIVE]

  1. std::forward 成为可选项以完美转发收到的右值引用
template<class T>
T&& seven(T&& x) { return std::forward<T&&>(x); }

变成

template<class T>
T&& seven(T&& x) { return x; }
  1. std::move 成为本地创建的右值引用的可选项
Widget&&
test_seven(Widget w) {
    Widget&& rr = seven(std::move(w));
    return std::move(rr);
}

变成

Widget&&
test_seven(Widget w) {
    Widget&& rr = seven(std::move(w));
    return rr;
}
  1. std::move optionaly 成为 parenthesis only for return 本地创建的东西的右值引用。
Widget&& h3(Widget t) {
  return std::move(t);
}

变成

Widget&& h3(Widget t) {
  return (t);
}

注意:(3) : clang trunk 在我 post 时警告 returning 本地堆栈地址。


更新 2021-08-02

https://github.com/cplusplus/papers/issues/968#issuecomment-915353127

https://isocpp.org/files/papers/P1018R13.html#P2266r1

投票结果:✅ 共识。然而,反对票来自实施者,并带来了相关的新信息。这个话题需要重新讨论,可能无法通过全会投票。

以上三点都是正确的。在所有情况下,所讨论的变量都是一个 隐式移动实体 (除了 seven 如果用左值实例化),因此被视为 xvalue。

这里的括号:

Widget&& h3(Widget t) {
  return (t);
}

实际上什么都不做。他们会如果函数 returned decltype(auto) - 从那时起没有括号函数会 return Widget (但仍然移动 t,而不是复制它)。