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