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

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

如果不正确,请更正以下几点:
[直播]

  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 对于本地创建的 rvalue ref 成为可选
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::moveoptionaly 变为parenthesis only为本地创建的事物返回一个右值引用。
Widget&& h3(Widget t) {
  return std::move(t);
}

变成

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

注意:(3) : clang trunk 在我发布这篇文章时警告返回本地堆栈地址。

回答

这三点都是正确的。在所有情况下,所讨论的变量都是隐式可移动实体(除非seven使用左值实例化),因此被视为 xvalue。

这里的括号:

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


以上是(c++23隐式移动)将移动的本地存储变量作为仅带括号的右值引用返回?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>