Когда это даст другой ответ, и когда эта разница будет полезной, если вообще?
В чем разница между is_trivially_copyable и is_trivially_copy_constructible?
Ответ 1
Предыдущие тесты для тривиально скопируемого свойства, которое в нескольких словах означает, что тип memcpy
-safe.
Тривиально-скопируемый класс - это класс, который:
- нет нетривиальных конструкторов копирования (12.8),
- нет нетривиальных конструкторов перемещения (12.8),
- нет нетривиальных операторов присваивания копий (13.5.3, 12.8),
- нет нетривиальных операторов присваивания перемещения (13.5.3, 12.8) и
- имеет тривиальный деструктор (12.4).
Тривиальный класс - это класс, имеющий тривиальный конструктор по умолчанию (12.1) и тривиально копируемый.
[Примечание. В частности, тривиально-копируемый или тривиальный класс не имеет виртуальных функций или виртуальных базовых классов.-end note]
Последний проверяет наличие тривиального конструктора копии, что, кстати, является требованием для тривиально скопируемого свойства. В основном это означает, что конструктор копирования для типа выполняет побитовое копирование.
Конструктор копирования/перемещения для класса X тривиален, если он не предоставляется пользователем и если
- класс X не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1) и
- конструктор, выбранный для копирования/перемещения каждого подобъекта прямого базового класса, тривиален и
- для каждого нестатического элемента данных X, относящегося к типу класса (или его массиву), конструктор выбранный для копирования/перемещения этого элемента тривиально,
в противном случае конструктор copy/move не является тривиальным.
Легко изготовить тип, который дает разные результаты для этих признаков:
struct foo {
foo(foo const&) = default; // this is a trivial copy constructor
~foo(); // this is a non-trivial destructor
};