yni*_*ous 18 c++ default-constructor move-constructor
我试图为没有复制构造函数的类实现移动构造函数.我收到一个错误,该类的成员的默认构造函数丢失.
这是一个简单的例子来说明这一点:
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) {}
};
Run Code Online (Sandbox Code Playgroud)
试着编译这个,我得到:
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;
^
Run Code Online (Sandbox Code Playgroud)
为什么这是一个错误?有什么办法吗?
eer*_*ika 24
为什么移动构造函数需要其成员的默认构造函数?
您定义的移动构造函数 default构造成员.如果默认构造任何成员,则这些成员需要默认构造函数.
构造函数(可以是常规,复制或移动)默认初始化成员初始化列表中未列出的成员,也没有默认成员初始化.B::a不在移动构造函数的成员初始化列表中(它根本没有初始化列表),并且它没有默认成员初始化.
有什么办法吗?
最简单的说,使用默认的移动构造函数:
B(B&&) = default;
Run Code Online (Sandbox Code Playgroud)
默认的移动构造函数move-构造成员.
Pet*_*ker 17
使用构造函数的初始化列表初始化A成员.如上所述,移动构造函数使用编译器所说的默认构造函数A.
B(B&& b) : a(std::move(b.a)) {}
Run Code Online (Sandbox Code Playgroud)
Nic*_*las 10
移动构造函数通常不必提供默认初始化.你的移动构造函数.
移动构造函数仍然是构造函数.因此,它必须初始化所有子对象.如果您不提供显式初始化,那么它将尝试默认初始化它们.如果它不能做到这一点,你会收到一个错误.
因此,您可以初始化它们(可能是从中移动b),或者只使用= default移动构造函数并让编译器完成它的工作.
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |