Этот код не будет компилироваться с gcc 4.7.0:
class Base
{
public:
Base(const Base&) = delete;
};
class Derived : Base
{
public:
Derived(int i) : m_i(i) {}
int m_i;
};
Ошибка:
c.cpp: In constructor ‘Derived::Derived(int)’:
c.cpp:10:24: error: no matching function for call to ‘Base::Base()’
c.cpp:10:24: note: candidate is:
c.cpp:4:2: note: Base::Base(const Base&) <deleted>
c.cpp:4:2: note: candidate expects 1 argument, 0 provided
Другими словами, компилятор не генерирует конструктор по умолчанию для базового класса, а вместо этого пытается вызвать удаленный Копировать конструктор как единственную доступную перегрузку.
Это нормальное поведение?
C ++ 11 §12.1 / 5 гласит:
дефолт конструктор для класса
X
конструктор классаX
это можно назвать без аргумента. Если нет объявленного пользователем конструктора для классаX
конструктор, не имеющий параметров, неявно объявляется как дефолтный (8.4).
Ваш Base(const Base&) = delete;
считается как объявленный пользователем конструктор, поэтому он подавляет генерацию неявного конструктора по умолчанию. Обходной путь, конечно, должен объявить это:
Base() = default;
Других решений пока нет …