c++ - move 代码与复制代码相同时的规则 5?

标签 c++ move-semantics

假设我的类只有一个成员,一个 int。 “move ”这个 int 而不是复制它没有任何好处。因此,我是否需要一个 move 构造函数和一个 move 赋值运算符,它们都与它们的复制表兄弟执行相同的操作?

最佳答案

如果你的类对复制成员或析构函数没有做任何特殊的事情,最好的办法就是不声明它们:

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

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

    // ...
};

这为您的类提供了编译器生成的复制和 move 成员(以及析构函数),它们与 int 本身的成员相同。

如果您的类对析构函数或任一复制成员做了一些特殊的操作,并且您希望编译器为 move 成员生成行为,那么您必须= default 它们。否则,您将没有 move 成员,这可能正是您想要的(从右值复制使用复制成员)。

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

    // ...
};

请注意,您的类从左值复制和从右值复制的行为不同是非常不寻常的,如上面代码所述。我无法立即想出此类代码的激励用例。

如果您希望能够复制类的右值,但没有特殊的“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,但 move 只是根据 A 的复制成员进行复制。

关于c++ - move 代码与复制代码相同时的规则 5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59606642/

相关文章:

c++ - 成员函数返回成员变量的右值引用

c++ - 如何在编辑控件上自动隐藏滚动条

c++ - 标准矩形类

java - 监听 DOM 结构的变化

c++ - 为什么不能 move 这些变量?

c++ - std::queue::pop() 对其 std::unique_ptr 数据的操作

c++ - 带有嵌入式竞技场的堆栈分配器问题

c++ - 我需要一些 C++ 结构建议

c++ - Visual Studio 2019中的GDAL库头文件错误和警告

c++ - 我可以在函数的结果上使用 std::move 来构造一个新对象吗?