Я хочу, чтобы класс 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 тривиально? Я знаю, что есть проблемы с удалением специальных методов, но составное присваивание не является специальным методом (верно?).

4
FreeQuark 14 Сен 2014 в 11:20
2
Вы можете проверить себя с помощью std::is_trivially_copyable.
 – 
Jarod42
14 Сен 2014 в 17:17
Спасибо, @Jarod42. Я использую GCC v4.8.2, где std::is_tribuly_copyable еще не реализован... (по крайней мере, это сообщение об ошибке, которое я получаю всякий раз, когда пытаюсь вызвать его, используя ). Я бы использовал его иначе. Кстати, вы знаете какие-нибудь компиляторы, где это может быть реализовано?
 – 
FreeQuark
14 Сен 2014 в 21:34

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) - это специальные функции-члены .

9
Columbo 14 Сен 2014 в 12:18
Спасибо! Этот факт очень помогает. Я подозревал это, но я не знал, может ли какая-то спецификация где-нибудь в стандарте, касающаяся функции =delete, предотвратить использование memcpy в таких производных типах.
 – 
FreeQuark
14 Сен 2014 в 12:24

Я думаю, вы на правильном пути - если A тривиально копируемо, а B является производным от A и просто удаляет некоторые обычные методы (или операторы), B также будет тривиально копируемым.

3
John Zwinck 14 Сен 2014 в 12:08
Спасибо! Это позволяет мне безопасно получить класс унитарных матриц фиксированного размера из общего класса матриц фиксированного размера (унитарные матрицы не замыкаются на + или -), сохраняя при этом непрерывность данных.
 – 
FreeQuark
14 Сен 2014 в 12:32