我有一个简单的数据类,我想在其中保存一些类型并让编译器生成move构造函数和赋值运算符:
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_
属性执行正确的操作吗?它将对它应用移动语义吗?
来自[class.copy]的规则是:
非联合类的隐式定义的复制/移动构造函数
X
执行其基和成员的成员式复制/移动。
因此,在这种情况下,它将同时移动和构造/分配x_
和y_
。从A
您正在移动构造/分配的位置开始。
请注意,如果默认的move构造函数的成员之一未隐式定义move构造函数,则仍可以执行副本:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句