代码之家  ›  专栏  ›  技术社区  ›  anton_rh

在每个不提供用户定义的类中声明显式默认的move构造函数是一种好做法吗?

  •  2
  • anton_rh  · 技术社区  · 7 年前

    (对我来说)有很多复杂的事情 rules 定义何时生成隐式默认移动构造函数以及何时不生成该构造函数。我担心的是不会生成默认的move构造函数。此外,我担心我(或其他人)将来修改该类,隐式move构造函数将消失。

    有一个 "advice" 上面说 “对于可以使用自动生成的函数,始终可以显式调用默认生成 = default (这就是语法的含义) . 现在我在问:这是个好主意吗?有什么理由不这样做吗?我想如果没有问题的话,我们就不需要默认的移动构造函数,移动构造函数总是会生成的。但由于该标准定义了如此严格的规则,可能有这样做的理由。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Daniel Langr    7 年前

    考虑以下场景。您有一个可以使用自动生成的移动构造函数和析构函数的类:

    class X {
          int i_;
       public:
          X(int i) : i_(i) { }
    };
    

    然后,在将来添加一个成员变量,该变量需要用户定义的复制构造函数和析构函数:

    class X {
          int i_;
          char* buf_;
          size_t n_;
       public:
          X(int i, size_t n) : i_(i), n_(n), buf_(new char[n]) { }
          X(const X& o) : i_(o.i_), n_(o.n_), buf_(new char[o.n_]) { memcpy(buf_, o.buf_, n); }
          ~X() { delete[] buf_; }
    };
    

    如果移动构造函数 default 在这里,新的类版本将是错误的。

    没有 违约 ed move构造函数,根据 五人规则 也就是说,如果需要 用户定义的 ,其他可能需要 用户定义的 也现在,如果需要,您必须手动定义移动构造函数。