Каква е разликата между is_trivially_copyable и is_trivially_copy_constructible?

Кога те биха дали различен отговор и кога тази разлика би била полезна, ако изобщо би била полезна?


person rubenvb    schedule 14.05.2013    source източник


Отговори (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
};
person R. Martinho Fernandes    schedule 14.05.2013
comment
@Dave Не. И ТАКА иска да кажа това с 15 знака. - person R. Martinho Fernandes; 14.05.2013
comment
Можете да намерите повече информация за тези свойства в моя изчерпателен отговор относно PODs в C++11. - person R. Martinho Fernandes; 14.05.2013
comment
Мисля, че би било интересно да се видят примери за това, когато двете черти дават различни резултати - както изисква въпросът - за да се илюстрира разликата по-директно. Сещате ли се за примери? - person Magnus Hoff; 14.05.2013
comment
@Dave Погледнете изброените изисквания, както може да се види, това е само първото изискване в списъка и следователно едно от многото. - person Christian Rau; 14.05.2013
comment
@ChristianRau коментирах, преди той да редактира, за да добави тези списъци. - person David; 14.05.2013
comment
няма ли is_trivially_copy_constructible само по себе си да е достатъчно, за да бъде memcpy/memmove/realloc безопасно?? - person Martin Ba; 03.03.2016
comment
Всъщност foo няма да осигури различни резултати в много реализации. Вижте LWG2827. - person Daniel Langr; 16.09.2020