Конструкторы перемещения и копирования должны перемещать и соответственно копировать базовые классы и элементы данных класса, без каких-либо побочных эффектов
Конструкторы перемещения и копирования должны перемещать и соответственно копировать базовые классы и элементы данных класса без каких-либо побочных эффектов.
Ожидаемое поведение конструкторов перемещения и копирования:
Они перемещают или копируют базовые классы и элементы данных.
Конструктор перемещения устанавливает исходный объект в допустимое состояние.
Создание конструкторов move или copy, имеющих дополнительные побочные эффекты, может вызвать следующие проблемы:
Производительность: конструкторы перемещения и копирования часто вызываются алгоритмами и контейнерами библиотеки стандартных шаблонов (STL). Накладные расходы на производительность в этих конструкторах, вызванные побочными эффектами, могут накапливаться и влиять на производительность кода.
Непредвиденное поведение: Поскольку компиляторы могут пропускать вызовы для копирования конструкторов для оптимизации кода, число вызовов конструктора копирования является неопределенным. В результате побочные эффекты конструктора копирования могут привести к неожиданному поведению.
В теле конструктора копирования или перемещения Polyspace ® не помечает следующие операции:
Копирование или перемещение назначений.
Реляционные операции или операции сравнения.
Изменение исходного объекта в операции перемещения.
Вызовы функции std::swap или эквивалентный определяемый пользователем noexceot функции подкачки. Polyspace идентифицирует функции, которые эти сигнатуры как функции подкачки: void T::swap(T&) или void [N::]swap(T&, T&). Первая сигнатура представляет функцию-член класса T для этого требуется один аргумент. Вторая сигнатура представляет не являющуюся членом или статическую функцию в пространстве имен N для этого требуется два аргумента. Имя swap может быть без учета регистра и префиксом или постфиксированным подчеркиванием.
Присвоение и изменение static переменные.
Polyspace помечает любые другие операции в конструкторе копирования или перемещения как нежелательный побочный эффект. Например, вызов определяемой пользователем функции свопа считается нежелательным побочным эффектом, если функция свопа не является noexcept. Аналогичное правило для оператора назначения копирования и перемещения см. в разделе AUTOSAR C++14 Rule A6-2-1.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Специальные функции-члены |
| Категория: Обязательно, Автоматизировано |