【问题标题】:Why does defaulted-move-ctor inhibit implicit-copy-ctor but not defaulted-copy-ctor?为什么 defaulted-move-ctor 会抑制implicit-copy-ctor 而不是 default-copy-ctor?
【发布时间】:2019-04-24 15:58:29
【问题描述】:

我似乎遇到过一个例子,在这个例子中,一个默认的移动构造函数似乎根据情况同时算作用户声明和非用户声明:

struct Foo {
    int a;
    Foo():a(42){};
    //Foo(const Foo & other) = default;
    Foo(Foo && other) = default;

};

int main() {
    Foo f;
    Foo g = f;
}

结果:

test.cpp:11:9: error: call to implicitly-deleted copy constructor of 'Foo'
    Foo g = f;
        ^   ~
test.cpp:5:5: note: copy constructor is implicitly deleted because 'Foo' has a user-declared move constructor
    Foo(Foo && other) = default;
    ^

编译器错误是预期的,因为 cppreference 告诉我们:

类 T 的隐式声明或默认的复制构造函数是 如果满足以下任一条件,则定义为已删除:
[...]
T 有一个用户定义的移动构造函数或移动赋值运算符;

注意,默认的构造函数在这里显然算作“用户声明的”。 但是,如果我们现在从第 4 行中删除 cmets,从而显式默认复制构造函数,程序将编译而不会出错,即使我上面引用的语句指定:

隐式声明的或默认复制构造函数

这似乎是一个矛盾。这是 cppreference 中的错误还是我只是感到困惑?

【问题讨论】:

    标签: c++ standards copy-constructor default-copy-constructor


    【解决方案1】:

    这看起来像是 cppreference 的错误。声明移动构造函数/赋值运算符只会删除 隐式 声明的复制构造函数。实际上,将复制构造函数声明为默认值是用户声明它,因此不适用于这种情况。

    【讨论】:

      【解决方案2】:

      为什么 defaulted-move-ctor 会抑制implicit-copy-ctor 而不是 default-copy-ctor?

      因为当您将构造函数定义为默认值时,您正在重新建立由移动构造函数引起的删除效果,因此默认复制构造函数与显式定义它执行编译器将执行的操作具有相同的效果。

      【讨论】:

      • 它可以被删除,如果隐式声明的会发生这种情况。 stackoverflow.com/a/48987654/5001448 这是一个显式默认构造函数被有效删除并从重载池中删除的示例。
      • 那部分帖子与类成员对封闭类的构造函数的影响有关,这与你的情况不同。
      猜你喜欢
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2014-12-07
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多