Признак типа C++, говорящий «тривиально подвижный» — примеры ⇐ C++
-
Гость
Признак типа C++, говорящий «тривиально подвижный» — примеры
Я бы определил термин «тривиально подвижный» как
Вызов конструктора перемещения (или оператора присваивания перемещения) эквивалентно memcpy для передачи байтов в новое место назначения без вызова деструктор перемещенного объекта.
Например, если вы знаете, что это свойство сохраняется, вы можете использовать realloc для изменения размера std::vector или пула памяти.
Типы, которые не справляются с этой задачей, обычно имеют указатели на их содержимое, которое необходимо обновить с помощью конструктора перемещения/оператора присваивания.
Я не могу найти таких типовых признаков в стандарте. Мне интересно, есть ли у этого уже (лучшее) имя, обсуждалось ли оно и есть ли какие-нибудь библиотеки, использующие такую особенность.
Изменить 1:
Судя по первым нескольким комментариям, std::is_тривиально_move_constructible и std::is_тривиально_move_assignable не эквивалентны тому, что я ищу. Я считаю, что они бы дали true для типов, содержащих указатели на самих себя, поскольку чтение вашего собственного члена, похоже, подпадает под «тривиальную» операцию.
Изменить 2:
При правильной реализации типы, указывающие на себя, не будут тривиально_move_constructible или move_assignable, поскольку оператор перемещения/перемещения больше не является тривиальным. Однако мы должны быть в состоянии сказать, что unique_ptr можно безопасно скопировать в новое место, если мы не вызываем его деструктор.
Я бы определил термин «тривиально подвижный» как
Вызов конструктора перемещения (или оператора присваивания перемещения) эквивалентно memcpy для передачи байтов в новое место назначения без вызова деструктор перемещенного объекта.
Например, если вы знаете, что это свойство сохраняется, вы можете использовать realloc для изменения размера std::vector или пула памяти.
Типы, которые не справляются с этой задачей, обычно имеют указатели на их содержимое, которое необходимо обновить с помощью конструктора перемещения/оператора присваивания.
Я не могу найти таких типовых признаков в стандарте. Мне интересно, есть ли у этого уже (лучшее) имя, обсуждалось ли оно и есть ли какие-нибудь библиотеки, использующие такую особенность.
Изменить 1:
Судя по первым нескольким комментариям, std::is_тривиально_move_constructible и std::is_тривиально_move_assignable не эквивалентны тому, что я ищу. Я считаю, что они бы дали true для типов, содержащих указатели на самих себя, поскольку чтение вашего собственного члена, похоже, подпадает под «тривиальную» операцию.
Изменить 2:
При правильной реализации типы, указывающие на себя, не будут тривиально_move_constructible или move_assignable, поскольку оператор перемещения/перемещения больше не является тривиальным. Однако мы должны быть в состоянии сказать, что unique_ptr можно безопасно скопировать в новое место, если мы не вызываем его деструктор.
Мобильная версия