Перемещенный - от объекта не буду получен доступ чтением
Перемещенный - от объекта не буду получен доступ чтением.
Поскольку содержимое исходного объекта обычно не задано после операции пересылки, небезопасно выполнить операции, которые получают доступ к содержимому исходного объекта после операции пересылки. Доступ к содержимому исходного объекта после операции пересылки может привести к нарушению целостности данных, неожиданному значению или недопустимому разыменованию указателя.
Операции, которые не делают предположений о состоянии объекта, не нарушают это правило.
Стандарт C++ указывает, что эти операции пересылки оставляют исходный объект в хорошо заданном состоянии после перемещения:
Переместите конструкцию, присвоение перемещения, преобразовав [1] конструкция перемещения, и преобразовав присвоение перемещения std::unique_ptr
ввод
Переместите конструкцию, присвоение перемещения, преобразовав конструкцию перемещения, преобразовав присвоение перемещения std::shared_ptr
ввод
Переместите присвоение конструкции и перемещения от std::unique_ptr
из std::shared_ptr
ввод
Переместите конструкцию, присвоение перемещения, преобразовав конструкцию перемещения, и преобразовав присвоение перемещения std::weak_ptr
ввод
std::move()
из std::basic_ios
ввод
Переместите конструктора и присвоение перемещения std::basic_filebuf
ввод
Переместите конструктора и присвоение перемещения std::thread
ввод
Переместите конструктора и присвоение перемещения std: unique_lock
ввод
Переместите конструктора и присвоение перемещения std::shared_lock
ввод
Переместите конструктора и присвоение перемещения std::promise
ввод
Переместите конструктора и присвоение перемещения std::future
ввод
Переместите конструкцию, присвоение перемещения, преобразовав конструкцию перемещения, и преобразовав присвоение перемещения std::shared_future
ввод
Переместите конструктора и присвоение перемещения std::packaged_task
ввод
Поскольку эти операции пересылки оставляют исходный объект в хорошо заданном состоянии, получение доступ к исходному объекту после вызывания этих функций совместимо с этим правилом.
Polyspace® повышает флаг, если исходный объект читается после того, как его содержимое перемещено в целевой объект путем вызова std::move
функционируйте явным образом. Polyspace не отмечает доступ к исходному объекту если:
Исходный объект явной операции пересылки имеет эти типы:
std::unique_ptr
std::shared_ptr
std::weak_ptr
std::basic_ios
std::basic_filebuf
std::thread
std::unique_lock
std::shared_lock
std::promise
std::future
std::shared_future
std::packaged_task
Операция пересылки выполняется неявно. Например, функциональный std::remove
может получить доступ к исходному объекту после неявной операции пересылки. Polyspace не отмечает его. Лучшая практика состоит в том, чтобы избежать таких операций и использовать более безопасные альтернативы, которые предотвращают случайный доступ, такой как std::erase
.
Исходный объект имеет встроенный базовый тип, такой как: int
, enum
, float
'double'
, указатель, std::intptr_t
, std::nullptr_t
.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Специальные функции членства |
Категория: Необходимый, Частично автоматизированный |
[1] Конструктор преобразования является конструктором, который не объявляется со спецификатором explicit
. Смотрите конструктора Преобразования.