代码之家  ›  专栏  ›  技术社区  ›  Swiss Frank

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

  •  1
  • Swiss Frank  · 技术社区  · 6 年前

    int

    0 回复  |  直到 6 年前
        1
  •  2
  •   Howard Hinnant    6 年前

    如果您的类对复制成员或析构函数没有什么特殊的作用,那么最好不要声明它们:

    class A
    {
        int i_;
    public:
        // Special members
        A() : i_{0} {}
    
        // Other constructors
        explicit A(int i) : i_{i} {}
    
        // ...
    };
    

    这使类编译器生成的复制和移动成员(和析构函数)与 int

    = 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} {}
    
        // ...
    };
    

    请注意,您的类在从左值复制和从右值复制时表现出不同的行为是非常不寻常的,如上面代码所述。我无法立即为这样的代码提供一个激励性的用例。

    如果您希望能够复制类的右值,但不需要特殊的“移动”处理(只需使用copy),那么典型的公式是:

    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. 的副本成员。