Рассмотрим базовый класс, который предотвращает создание копий и присваивание копий следующим образом:
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);
or
CopyTest ct;
CopyTest ct1 = ct2;
Компилятор выдает ошибку: use of deleted function xxx
(где xxx - мой удаленный ctor копии или оператор копирования)
Затем, если я хочу std::move
объект CopyTest
:
CopyTest ct;
CopyTest ct1 = std::move(ct);
Компилятор выдает ту же ошибку (использование удаленной функции xxx - где xxx остается моим оператором копирования или оператором присваивания).
Если я правильно напомню, это потому, что разработчик не определил правильный оператор перемещения / присваивания.
Можно ли заставить компилятор сообщить разработчику класса CopyTest
, что ошибка перемещения здесь, потому что он не определил правильный оператор перемещения / присваивания, а не потому, что оператор копирования / присваивания удален из базовый класс?
Платформа :
Debian 9
GCC 6.3.0
Флаги компиляции:
-fpermissive -ggdb -std = c ++ 11
std::move
). Я бы не стал об этом беспокоиться. - person Cássio Renan   schedule 12.12.2018