C++ именованные требования: TriviallyCopyable (с C++11)
Примечание: стандарт не определяет именованное требование с таким именем. Это категория типов, определенная основным языком. Она включена здесь как именованное требование только для согласованности.
Требования
Следующие типы коллективно называются типами, тривиально копируемыми:
- скалярные типы
- типы тривиально копируемых классов
- массивы таких типов
- cv-квалифицированные версии этих типов
Примечания
В общем случае, для любого тривиально копируемого типа T и объекта obj1 типа T, подлежащие байты obj1 могут быть скопированы в массив char, или unsigned char, или 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 | C++03 POD с удалённой нетривиальной операцией присваивания не был тривиальным | разрешённые конструкторы/операторы |
| CWG 2094 | C++11 | Скалярные типы volatile не являются тривиально копируемыми (CWG 1746) | сделаны тривиально копируемыми |
См. также
|
(C++11) | проверяет, является ли тип тривиально копируемым (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/named_req/TriviallyCopyable