为什么Base
的移动构造函数在继承(class B
)的情况下必须在以下代码中(在gcc 7.2和clang 4.0中)?我希望在C ++ 17中不需要保证副本省略,就像组合(class A
)一样。
struct Base {
Base(Base&&) = delete;
Base& operator=(Base&&) = delete;
Base()
{
}
};
Base make_base()
{
return Base{};
}
struct A {
A() : b(make_base()) {} // <<<--- compiles fine
Base b;
};
#ifdef FAIL
struct B : public Base {
B() : Base(make_base()) {} // <<<--- "Base(Base&&) is deleted"
};
#endif
答案 0 :(得分:10)
这是标准措辞中的缺陷。初始化基类子对象时无法保证复制省略,因为基类的布局可能与对应的完整对象类型不同。