如何解决c++23 隐式移动将移动的本地存储变量作为仅带括号的右值引用返回?
关于“更简单的隐式移动”(P2266R1) 提案,我不确定我是否正确理解了这个新的“符合移动条件”的东西。
如果不正确,请更正以下几点:
[LIVE]
-
std::forward
成为可选项以完美转发收到的右值引用
template<class T>
T&& seven(T&& x) { return std::forward<T&&>(x); }
变成
template<class T>
T&& seven(T&& x) { return x; }
-
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;
}
-
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 举报,一经查实,本站将立刻删除。