Кога те биха дали различен отговор и кога тази разлика би била полезна, ако изобщо би била полезна?
Каква е разликата между is_trivially_copyable и is_trivially_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