Определяемые пользователем операторы копирования и переноса должны использовать определяемую пользователем функцию no-throw swap
Определяемые пользователем операторы копирования и переноса должны использовать определяемую пользователем функцию no-throw swap.
Наивный оператор копирования или перемещения назначения, который реализован без использования функции swap, может следовать шаблону в этом коде:
class A{ //... A & operator=(const A & rhs) { if (this != &rhs) // check for self assignment { // release resource in lhs // Allocate resource for modified lhs // Copy or move the resources from rhs to lhs } return *this; } private: //resources int* mArray; };
Чтобы решить эти проблемы, используйте пользовательские swap
функции, которые не вызывают исключений. Рассмотрим этот шаблон:
class A{ //... A & operator=(A rhs) { Swap(*this,rhs); } friend void Swap(A& lhs, A& rhs) noexcept{ //... } private: //resources int* mArray; };
noexcept
функциональные Swap
. Этот Swap
функция может быть реализована путем использования std::swap
функция. Преимущества этого шаблона:
Сильная безопасность исключения: Эта реализация оператора копирования или перемещения принимает временную копию правого операнда при помощи конструктора копирования или перемещения и меняет временную копию на левый операнд. Потому что функции перемещения и замены должны быть noexcept
исключение может быть вызвано только операцией копирования. Если этот оператор вызывает исключение, только временная копия правого операнда может быть признана недействительной. Состояние правого или левого операнда остается нетронутым.
Повторное использование кода: В этой реализации оператор копирования или перемещения назначения повторно использует конструктор копирования или перемещения. Специфичные для класса swap
функция может также использоваться повторно для реализации других алгоритмов.
Эффективность: Устраняя проверку на самоопределение, оператор более эффективен.
Чтобы реализовать оператор копирования или перемещения, используйте пользовательские noexcet
функции swap.
Polyspace® помечает оператор копирования или перемещения, если он не содержит по крайней мере одного вызова пользовательской функции смены. Polyspace идентифицирует функции, которые имеют эти сигнатуры как функции свопа: void T::swap(T&)
или void [N::]swap(T&, T&)
. Первая сигнатура представляет представителю функцию T
классов это принимает один аргумент. Вторая сигнатура представляет часть или статическую функцию в пространстве имен
N
это принимает два аргумента. Имя swap
может быть нечувствительным к регистру и префиксированным или постфиксированным подчеркиванием.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Специальные функции представителей |
Категория: Консультационные, Автоматизированные |