Именованные требования C++: TriviallyCopyable (начиная с C++11)
Примечание: стандарт не определяет именованное требование с таким названием. Это категория типов, определённая основным языком. Здесь она включена как именованное требование только для единообразия.
Требования
Следующие типы в совокупности называются тривиально копируемыми типами:
- скалярные типы
- типы классов, тривиально копируемых
- массивы таких типов
- версии этих типов с квалификаторами cv
Примечания
В общем случае для любого тривиально копируемого типа T и объекта obj1 типа T базовые байты obj1 можно скопировать в массив char или unsignedchar, или std::byte(начиная с C++17) либо в obj2 — отдельный объект типа T. Ни obj1, ни obj2 не могут быть потенциально перекрывающимся подобъектом.
Если базовые байты obj1 скопировать в такой массив, а затем полученное содержимое скопировать обратно в obj1, obj1 сохранит исходное значение. Если базовые байты obj1 скопировать в obj2, obj2 будет содержать значение obj1.
Базовые байты можно копировать с помощью std::memcpy или std::memmove, если при этом не обращаются к существующему volatile-объекту.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение согласно опубликованной версии | Корректное поведение |
|---|---|---|---|
| CWG 1734 | C++11 | POD в C++03 с удалённым нетривиальным оператором присваивания не считался тривиальным | удалённые конструкторы/операторы разрешены |
| CWG 2094 | C++11 | volatile-скалярные типы не являются тривиально копируемыми (CWG 1746) | стали тривиально копируемыми |
См. также
|
(C++11) | проверяет, является ли тип тривиально копируемым (шаблон класса) |
|
(C++26) | проверяет, представляет ли рефлексия тривиально копируемый тип (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/TriviallyCopyable