Рассмотрим базовый класс, который предотвращает построение копирования и назначение копирования следующим образом:
class NonCopyable {
public:
NonCopyable() = default;
~NonCopyable() = default;
NonCopyable(NonCopyable const&) = delete;
NonCopyable& operator=(NonCopyable const&) = delete;
};
Теперь наши разработчики могут включить этот класс и использовать его для отключения копирования для унаследованных классов, например:
class CopyTest : public NonCopyable {
public:
CopyTest() {
std::cout << "copy test created" << std::endl;
}
~CopyTest() {
std::cout << "copy test deleted" << std::endl;
}
};
Когда я пытаюсь использовать класс CopyTest
:
CopyTest ct, ct1(ct);
или
CopyTest ct;
CopyTest ct1 = ct2;
Компилятор выдает ошибку: use of deleted function xxx
(где xxx - мойудаленная копия ctor или оператор копирования)
Затем, если я хочу std::move
a CopyTest
объект:
CopyTest ct;
CopyTest ct1 = std::move(ct);
Компилятор выдаст ту же ошибку (использование удаленной функции xxx- где xxx остается моим экземпляром ctor или оператором присваивания).
Если я правильно напомню, это потому, что разработчик не определил правильный оператор ctor / переопределения перемещения.
Возможно ли этозаставить компилятор сообщить разработчику класса CopyTest
, что ошибка перемещения здесь, потому что он не определил правильный оператор ctor / assignement перемещения, а не потому, что оператор ctor / assignement копирования удален в базовом классе?
Платформа:
Debian 9
GCC 6.3.0
Флаги компиляции:
-fpermissive -ggdb -std = c ++11