【发布时间】:2018-03-21 20:36:33
【问题描述】:
我一直密切关注不要在退货声明中写std::move 的建议for example。除了有一些边缘情况,for example。
我相信以下是std::move 可能值得的另一个简单示例 - 我错过了什么吗?但我不知道为什么,这在未来的 C++ 中会改变吗?
#include <iostream>
struct A
{
};
struct C
{
};
struct B
{
B(const A&, const C&) { std::cout << "B was copied\n"; }
B(A&&, C&&) { std::cout << "B was moved\n"; }
};
B f()
{
A a;
C c;
//return {a, c}; // Gives "B was copied"
return {std::move(a), std::move(c)}; // Gives "B was moved"
}
int main() {
f();
return 0;
}
【问题讨论】:
-
您不是在尝试强制移动返回的对象,而是在构建它。这与建议无关。
-
那些不同的构造函数与
B被移动或复制没有任何关系。 -
您的代码与
return std::move(x);完全不同。你这里搬什么其实和回报没什么关系 -
移动或复制的不是
B,而是A和C。是你的文字不正确。
标签: c++ c++11 move-semantics rvo