Удаленный конструктор копирования приводит к удаленному конструктору по умолчанию

Этот код не будет компилироваться с 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

Другими словами, компилятор не генерирует конструктор по умолчанию для базового класса, а вместо этого пытается вызвать удаленный Копировать конструктор как единственную доступную перегрузку.

Это нормальное поведение?

6

Решение

C ++ 11 §12.1 / 5 гласит:

дефолт конструктор для класса X конструктор класса X это можно назвать без аргумента. Если нет объявленного пользователем конструктора для класса Xконструктор, не имеющий параметров, неявно объявляется как дефолтный (8.4).

Ваш Base(const Base&) = delete; считается как объявленный пользователем конструктор, поэтому он подавляет генерацию неявного конструктора по умолчанию. Обходной путь, конечно, должен объявить это:

Base() = default;
12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]