在大多数派生类中初始化基类const成员

时间:2018-08-18 15:58:49

标签: c++ constructor c++14 language-lawyer virtual-inheritance

在下面的代码中,我在派生程度最高的类const中初始化Base类的Grandchild成员。

class Base {
public:
    Base(int x_) : x(x_) {}

private:
    const int x;
};

class Child : public virtual Base {
public:
    virtual ~Child() = 0;
};

class Grandchild : public virtual Child {
public:
    Grandchild() : Base(42) {}
};

Child::~Child() {}

int main() {
    Grandchild gc;
}

在虚拟继承的情况下,Base类构造函数由最派生的类调用。因此,我希望代码能够成功编译。

clang 4.0编译成功,而gcc 4.9.2发出以下错误:

 In constructor 'Grandchild::Grandchild()': 
16:27: error: use of deleted function 'Child::Child()' 
9:7: note: 'Child::Child()' is implicitly deleted because the default definition would be ill-formed: 
9:7: error: no matching function for call to 'Base::Base()' 
9:7: note: candidates are: 3:5: note: Base::Base(int) 
3:5: note: candidate expects 1 argument, 0 provided 
1:7: note: constexpr Base::Base(const Base&) 
1:7: note: candidate expects 1 argument, 0 provided 
1:7: note: constexpr Base::Base(Base&&) 
1:7: note: candidate expects 1 argument, 0 provided 

标准对此有何说明?

1 个答案:

答案 0 :(得分:2)

似乎C ++标准发生了变化,阐明了virtual基类的生成构造函数的要求。参见CWG257。据我所知,您的情况应该允许。更改之前,情况尚不清楚。

此更改已于2009年10月投票通过了工作文件,即该更改应适用于使用C ++ 11进行编译。