【发布时间】:2017-01-10 20:40:11
【问题描述】:
我试图为没有复制构造函数的类实现移动构造函数。我收到一个错误,提示该类成员的默认构造函数丢失。
这里有一个简单的例子来说明这一点:
struct A {
public:
A() = delete;
A(A const&) = delete;
A(A &&a) {}
};
struct B {
A a;
B() = delete;
B(B const&) = delete;
B(B &&b) {}
};
试图编译这个,我得到:
move_without_default.cc: In constructor ‘B::B(B&&)’:
move_without_default.cc:15:11: error: use of deleted function ‘A::A()’
B(B &&b) {}
^
move_without_default.cc:6:2: note: declared here
A() = delete;
^
为什么这是一个错误?有什么办法吗?
【问题讨论】:
-
用
= default;替换{} -
因为
A的默认构造函数被删除了,但是B使用了它。 -
空的移动构造函数不会自动尝试逐个成员移动。您的移动构造函数正在尝试默认构造
a,而不是移动构造它。 -
嗯,通过删除
A的默认构造函数和复制构造函数,并且不实现除移动构造函数之外的任何其他构造函数,这是否意味着A对象在它可以之前永远不能被构造移动到另一个A对象?或者像大括号初始化这样的事情会绕过它?
标签: c++ default-constructor move-constructor