【发布时间】:2021-12-08 14:48:57
【问题描述】:
我已经知道自动移动不能使用从 Rvalue Reference 输入返回值的函数。但为什么呢?
以下是无法使用自动移动的示例代码。
Widget makeWidget(Widget&& w) {
....
return w; // Compiler copies w. not move it.
}
如果函数输入是按值复制,自动移动有效。
Widget makeWidget(Widget w) {
....
return w; // Compiler moves w. not copy it.
}
【问题讨论】:
-
移动不是复制省略。
-
@appleapple 这个例子不是 RVO 或 NRVO。但是编译器可以优化复制操作来移动操作。所以我不能称之为复制省略吗?
-
可能重复:stackoverflow.com/a/40187776/5980430(虽然看起来 c++20 改变了规则,正如@songyuanyao 的回答所示。
-
@appleapple 感谢您的评论。但我的观点是我已经知道这种编译器行为,但为什么呢?从 c++20 接受这个右值自动移动操作意味着很多人和我有同样的想法。上述示例的移动优化似乎很简单,但为什么 c++ 在 c++20 之前不能接受这个?
-
@OP 如果不清楚,我链接到 @Yakk 的答案,其中包含一些解释。
标签: c++ copy-elision