【发布时间】: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