Я хочу, чтобы класс B унаследовал все методы класса A, кроме нескольких (который предполагается тривиально копируемым), и при этом оставался тривиально копируемым. В C ++ 11 я могу удалять методы. Взять, к примеру:
class A { // trivially copyable
// private stuff here
public:
A& operator += (const A&);
// other public stuff here
};
class B: public A {
public:
B& operator += (const A&) = delete;
};
Можно ли копировать B тривиально? Я знаю, что есть проблемы с удалением специальных методов, но составное присваивание не является специальным методом (верно?).
2 ответа
Да, B
легко копировать - независимо от того, что вы делаете с неспециальными функциями-членами.
N3337, §9 / 6 :
тривиально копируемый класс - это класс, который:
- не имеет нетривиальных конструкторы копирования (12.8),
- нет нетривиальных конструкторов перемещения (12.8),
- нет нетривиальных операторов присваивания копий (13.5.3, 12.8),
- не имеет нетривиальных операторов присваивания перемещений (13.5.3, 12.8) и
- имеет тривиальный деструктор (12.4).
но составное присваивание - это не особый метод (верно?)
Нет, это не так.
N3337, §12 / 1 :
Конструктор по умолчанию (12.1), конструктор копирования и присваивание копии оператор (12.8), конструктор перемещения и оператор присваивания перемещения (12.8), и деструктор (12.4) - это специальные функции-члены .
Я думаю, вы на правильном пути - если A тривиально копируемо, а B является производным от A и просто удаляет некоторые обычные методы (или операторы), B также будет тривиально копируемым.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
std::is_trivially_copyable
.