Когда они дадут другой ответ, и когда это различие будет полезным, если вообще будет?
В чем разница между is_tribuly_copyable и is_tribuly_copy_constructible?
Ответы (1)
Первые тесты на свойство тривиально копируемое, которое в нескольких словах означает, что тип memcpy
-безопасен.
Тривиально копируемый класс — это класс, который:
— не имеет нетривиальных конструкторов копирования (12.8),
— не имеет нетривиальных конструкторов перемещения (12.8),
— не имеет нетривиальных копирующих операторов присваивания (13.5.3, 12.8),
- не имеет нетривиальных операторов присваивания перемещения (13.5.3, 12.8) и
— имеет тривиальный деструктор (12.4).
Тривиальный класс — это класс, который имеет тривиальный конструктор по умолчанию (12.1) и может быть легко скопирован.
[ Примечание. В частности, тривиально копируемый или тривиальный класс не имеет виртуальных функций или виртуальных базовых классов.—конец примечания]
Последний проверяет наличие тривиального конструктора копирования, что, кстати, является требованием для свойства тривиально копируемого. В основном это означает, что конструктор копирования для типа выполняет побитовое копирование.
Конструктор копирования/перемещения для класса X тривиален, если он не предоставляется пользователем и если
- класс X не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1), и
- конструктор, выбранный для копирования/перемещения каждого прямого подобъекта базового класса, тривиален, и
- для каждого нестатического члена данных X, который имеет тип класса (или его массив), конструктор, выбранный для копирования/перемещения этого члена, является тривиальным;
в противном случае конструктор копирования/перемещения нетривиален.
Легко создать тип, который дает разные результаты для этих признаков:
struct foo {
foo(foo const&) = default; // this is a trivial copy constructor
~foo(); // this is a non-trivial destructor
};
is_trivially_copy_constructible
самого по себе недостаточно, чтобы быть memcpy
/memmove
/realloc
безопасным??
- person Martin Ba; 03.03.2016
foo
не будет давать разных результатов во многих реализациях. См. LWG2827.
- person Daniel Langr; 16.09.2020