Наследовать от класса, у которого конструктор копирования удален


У меня есть класс base, который содержит только частный конструктор по умолчанию и открытый конструктор удаленной копии, и ничего больше.

class base {
private:
    base() = default;

public:
    base(const base&) = delete;
};

Если я попытаюсь наследовать от base и создать экземпляр класса derived , как показано ниже, g++ 4.8.2 не компилирует мой код, но VC++ 2013 делает это.

class derived : public base {
private:
    derived() = default;
};

derived x;

Итак, это ошибка в g++ или VC++ 2013 просто проигнорировал что-то?

Вот полный код...

class base {
private:
    base() = default;

public:
    base(const base&) = delete;
};

class derived : public base {
private:
    derived() = default;
};

derived x;

int main() { 
}

... и сообщение об ошибке g++.

main.cpp:12:5: error: 'constexpr derived::derived()' is private
     derived() = default;
     ^
main.cpp:15:9: error: within this context
 derived x;
         ^
main.cpp: In constructor 'constexpr derived::derived()':
main.cpp:3:5: error: 'constexpr base::base()' is private
     base() = default;
     ^
main.cpp:12:5: error: within this context
     derived() = default;
     ^
main.cpp: At global scope:
main.cpp:15:9: note: synthesized method 'constexpr derived::derived()' first required here
 derived x;
         ^
1 7

1 ответ:

Вы неправильно истолковываете ошибку, она говорит вам, что конструктор по умолчанию для derived недоступен (is private), поэтому вы не можете использовать его для создания объекта этого типа. Теперь создание его public на уровне derived не поможет, так как конструктор base также является private и поэтому не может быть использован в конструкторе derived.

Почему вы хотите, чтобы эти конструкторы были private?