移动代码与复制代码相同时的规则 5?
Rule of 5 when move code is the same as copy code?
假设我的 class 只有一个成员,int
。 "moving" 这个 int 而不是复制它没有任何好处。因此,我是否需要一个移动构造函数和一个移动赋值运算符,它们都只做与它们的复制表亲相同的事情?
如果您的 class 对复制成员或析构函数没有任何特殊之处,最好的办法是声明其中 none 个:
class A
{
int i_;
public:
// Special members
A() : i_{0} {}
// Other constructors
explicit A(int i) : i_{i} {}
// ...
};
这使您的 class 编译器生成的复制和移动成员(和析构函数)与 int
本身相同。
如果您的 class 对析构函数或任何一个复制成员做了一些特殊的事情,并且您希望编译器为移动成员生成行为,那么您必须 = default
它们。否则,您将没有移动成员,这可能正是您想要的(从右值复制使用复制成员)。
class A
{
int i_;
public:
// Special members
A() : i_{0} {}
A(const& A a); // do something special
A(A&&) = default; // just copy the int
A& operator=(A&&) = default; // just copy the int
// Other constructors
explicit A(int i) : i_{i} {}
// ...
};
请注意,您的 class 在从左值复制和从右值复制时表现不同是非常不寻常的,如上面的代码所述。我无法立即为此类代码提出一个激励性的用例。
如果您希望能够复制 class 的右值,但没有特殊的 "move" 处理(只需使用复制),那么典型的公式是:
class A
{
int i_;
public:
// Special members
A() : i_{0} {}
A(const& A a); // do something special for lvalues and rvalues
A& operator=(const& A a); // do something special for lvalues and rvalues
// Other constructors
explicit A(int i) : i_{i} {}
// ...
};
现在客户端仍然可以"move"A
,但是动作只是按照A
的复制成员进行复制。
假设我的 class 只有一个成员,int
。 "moving" 这个 int 而不是复制它没有任何好处。因此,我是否需要一个移动构造函数和一个移动赋值运算符,它们都只做与它们的复制表亲相同的事情?
如果您的 class 对复制成员或析构函数没有任何特殊之处,最好的办法是声明其中 none 个:
class A
{
int i_;
public:
// Special members
A() : i_{0} {}
// Other constructors
explicit A(int i) : i_{i} {}
// ...
};
这使您的 class 编译器生成的复制和移动成员(和析构函数)与 int
本身相同。
如果您的 class 对析构函数或任何一个复制成员做了一些特殊的事情,并且您希望编译器为移动成员生成行为,那么您必须 = default
它们。否则,您将没有移动成员,这可能正是您想要的(从右值复制使用复制成员)。
class A
{
int i_;
public:
// Special members
A() : i_{0} {}
A(const& A a); // do something special
A(A&&) = default; // just copy the int
A& operator=(A&&) = default; // just copy the int
// Other constructors
explicit A(int i) : i_{i} {}
// ...
};
请注意,您的 class 在从左值复制和从右值复制时表现不同是非常不寻常的,如上面的代码所述。我无法立即为此类代码提出一个激励性的用例。
如果您希望能够复制 class 的右值,但没有特殊的 "move" 处理(只需使用复制),那么典型的公式是:
class A
{
int i_;
public:
// Special members
A() : i_{0} {}
A(const& A a); // do something special for lvalues and rvalues
A& operator=(const& A a); // do something special for lvalues and rvalues
// Other constructors
explicit A(int i) : i_{i} {}
// ...
};
现在客户端仍然可以"move"A
,但是动作只是按照A
的复制成员进行复制。