为什么RVO不应用于基类子对象初始化?

时间:2017-09-06 02:00:21

标签: c++ c++17

为什么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

example

1 个答案:

答案 0 :(得分:10)

According to Richard Smith

  

这是标准措辞中的缺陷。初始化基类子对象时无法保证复制省略,因为基类的布局可能与对应的完整对象类型不同。