5

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

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

  1. std::forward对于完美转发收到的右值 ref 变为可选
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::moveoptionaly 变成parenthesis only为本地创建的东西返回一个右值引用。
Widget&& h3(Widget t) {
  return std::move(t);
}

变成

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

注意: (3) : clang trunk 在我发布此内容时警告返回本地堆栈地址。


2021-08-02 更新

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

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

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

4

1 回答 1

5

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

这里的括号:

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

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

于 2021-07-12T14:01:44.493 回答