移动代码与复制代码相同时为5的规则?

问题描述 投票:2回答:2

说我的班只有一个成员,即int。 “移动”此int而不是复制它没有任何好处。因此,我是否需要一个移动构造函数和一个移动赋值运算符,它们都只是简单地执行与其复制表兄弟相同的操作?

c++ move-semantics
2个回答
2
投票

如果您的类对复制成员或析构函数没有什么特别的事情,最好的办法是不声明任何一个:

class A
{
    int i_;
public:
    // Special members
    A() : i_{0} {}

    // Other constructors
    explicit A(int i) : i_{i} {}

    // ...
};

这将为您的类编译器生成的复制和移动成员(和析构函数)与int本身的成员相同。

[如果您的类对析构函数或任何一个复制成员进行了特殊处理,并且您希望编译器为移动成员生成行为,则必须将它们= default。否则,您将没有移动成员,这可能正是您想要的(从rvalues复制使用复制成员)。

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 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} {}

    // ...
};

现在客户仍然可以“移动” A,但是移动只是根据A的复制成员进行复制。


0
投票

如果没有定义您的move构造函数,则在满足以下条件的情况下,编译器会声明它:>

没有用户声明的cpy ctor或赋值运算符。没有用户声明的移动分配运算符。没有用户声明的析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.