Объект Moved-from не должен быть доступен для чтения
Перемещенный объект не должен быть доступен для чтения.
Поскольку содержимое исходного объекта обычно не определено после операции перемещения, небезопасно выполнять операции, которые обращаются к содержимому исходного объекта после операции перемещения. Доступ к содержимому исходного объекта после операции перемещения может привести к нарушению целостности данных, непредвиденному значению или недопустимой отмене ссылки на указатель.
Операции, не делающие предположений о состоянии объекта, не нарушают это правило.
Стандарт 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. См. раздел Преобразование конструктора.