微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

关于“更简单的隐式移动”(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 可选变成 parenthesis only 以返回本地创建的事物的右值引用。
Widget&& h3(Widget t) {
  return std::move(t);
}

变成

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

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

解决方法

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

此处的括号:

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

实际上什么都不做。如果函数返回 decltype(auto),他们会这样做 - 因为没有括号,函数将返回 Widget(但仍然移动 t,而不是复制它)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。