Инициализация константного члена базового класса в большинстве производных классовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Инициализация константного члена базового класса в большинстве производных классов

Сообщение Anonymous »

В приведенном ниже коде я инициализирую константный член базового класса в самом производном классе 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;
}
В случае виртуального наследования конструктор базового класса вызывается наиболее производным классом. Следовательно, я ожидаю, что код скомпилируется успешно.
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
Что говорит об этом стандарт?


Подробнее здесь: https://stackoverflow.com/questions/519 ... ived-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»