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

Dev*_*ull 22 c++ c++17

为什么在下面的代码(包括gcc 7.2和clang 4.0)Base中继承(class B)的情况下,移动构造函数是强制性的?我希望在C++ 17中不需要保证复制省略,就像composition(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
Run Code Online (Sandbox Code Playgroud)

Dev*_*ull 10

理查德史密斯说:

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