Подтвердить что ты не робот

В чем разница между is_trivially_copyable и is_trivially_copy_constructible?

Когда это даст другой ответ, и когда эта разница будет полезной, если вообще?

4b9b3361

Ответ 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
};