(c++23 隐式移动)将移动的本地存储变量作为仅带括号的右值引用返回?
(c++23 implicit move) Returning the moved local storage variable as an rvalue ref with only parenthesisses?
关于“更简单的隐式移动”提案 (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
optionaly 成为 parenthesis only
for return 本地创建的东西的右值引用。
Widget&& h3(Widget t) {
return std::move(t);
}
变成
Widget&& h3(Widget t) {
return (t);
}
注意:(3) : clang trunk 在我 post 时警告 returning 本地堆栈地址。
更新 2021-08-02
https://github.com/cplusplus/papers/issues/968#issuecomment-915353127
https://isocpp.org/files/papers/P1018R13.html#P2266r1
投票结果:✅ 共识。然而,反对票来自实施者,并带来了相关的新信息。这个话题需要重新讨论,可能无法通过全会投票。
以上三点都是正确的。在所有情况下,所讨论的变量都是一个 隐式移动实体 (除了 seven
如果用左值实例化),因此被视为 xvalue。
这里的括号:
Widget&& h3(Widget t) {
return (t);
}
实际上什么都不做。他们会如果函数 returned decltype(auto)
- 从那时起没有括号函数会 return Widget
(但仍然移动 t
,而不是复制它)。
关于“更简单的隐式移动”提案 (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
optionaly 成为parenthesis only
for return 本地创建的东西的右值引用。
Widget&& h3(Widget t) {
return std::move(t);
}
变成
Widget&& h3(Widget t) {
return (t);
}
注意:(3) : clang trunk 在我 post 时警告 returning 本地堆栈地址。
更新 2021-08-02
https://github.com/cplusplus/papers/issues/968#issuecomment-915353127
https://isocpp.org/files/papers/P1018R13.html#P2266r1
投票结果:✅ 共识。然而,反对票来自实施者,并带来了相关的新信息。这个话题需要重新讨论,可能无法通过全会投票。
以上三点都是正确的。在所有情况下,所讨论的变量都是一个 隐式移动实体 (除了 seven
如果用左值实例化),因此被视为 xvalue。
这里的括号:
Widget&& h3(Widget t) {
return (t);
}
实际上什么都不做。他们会如果函数 returned decltype(auto)
- 从那时起没有括号函数会 return Widget
(但仍然移动 t
,而不是复制它)。