我有一个简单的数据类,我想在其中保存一些输入并让编译器生成移动构造函数和赋值运算符:
class A
{
public:
A(int x, std::string&& y) : x_(x), y_(std::move(y)) {}
A(A && a) = default;
A& operator= (A && a) = default;
private:
int x_;
std::string y_;
};
假设我的编译器符合100%C ++ 11标准,它是否会使用std::string y_
属性做正确的事情?它会将移动语义应用于它吗?
答案 0 :(得分:3)
来自[class.copy]的规则是:
非联合类
X
的隐式定义的复制/移动构造函数执行成员复制/移动 其基地和成员。
因此,在这种情况下,它将移动构造/分配x_
和y_
。来自您移动的A
- 构建/分配。
请注意,默认的移动构造函数仍然可以执行复制,如果其中一个成员具有未隐式定义的移动构造函数:
struct A {
A() { }
A(A const& ) { }
// A(A&& ) not implicitly defined because of the copy ctor
};
struct B {
B() = default;
B(B&& ) = default;
B& operator=(B&& ) = default;
A a;
};
B b;
B c = std::move(b); // copy-constructs c.a from b.a
答案 1 :(得分:1)
是的,这将是产生特殊成员函数的重点。
但是,您忘记将构造函数的参数移动到成员中:
A(int x, std::string&& y) : x_(x), y_(std::move(y)) {}
// ^^^^^^^^^^ ^