(c++23隐式移动)将移动的本地存储变量作为仅带括号的右值引用返回?
关于“更简单的隐式移动”(P2266R1)提案,我不确定我是否正确理解了这个新的“符合移动条件”的东西。
如果不正确,请更正以下几点:
[直播]
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对于本地创建的 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;
}
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,而不是复制它)。