Masked Man
Masked Man

Reputation: 11045

Initializing base class const member in most derived class

In the below code, I initialize const member of Base class in the most derived class 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;
}

In case of virtual inheritance, the Base class constructor is called by the most derived class. Hence, I expect the code to compile successfully.

clang 4.0 compiles it successfully, whereas gcc 4.9.2 emits the following error:

 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 

What does the standard say about this?

Upvotes: 4

Views: 367

Answers (1)

Dietmar Kühl
Dietmar Kühl

Reputation: 153840

It seems there was a change in the C++ standard clarifying the requirements of generated constructors for virtual base classes. See CWG257. As far as I understand this text your situation should be allowed. Prior to the change the situation was unclear.

This change was voted into the Working Paper in October 2009, i.e., it should be applicable to compiling with C++11.

Upvotes: 2

Related Questions