В чем разница между is_tribuly_copyable и is_tribuly_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
@ Дэйв Нет. И ТАК хочет, чтобы я сказал это с помощью 15 символов. - person R. Martinho Fernandes; 14.05.2013
comment
Вы можете найти дополнительную информацию об этих свойствах в моем исчерпывающем ответе о POD в 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