在下面的代码中,我在派生程度最高的类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
标准对此有何说明?
答案 0 :(得分:2)
似乎C ++标准发生了变化,阐明了virtual
基类的生成构造函数的要求。参见CWG257。据我所知,您的情况应该允许。更改之前,情况尚不清楚。
此更改已于2009年10月投票通过了工作文件,即该更改应适用于使用C ++ 11进行编译。