Определяемые пользователем операторы назначения копирования и перемещения должны использовать определяемую пользователем функцию без замены
Определяемые пользователем операторы назначения копирования и перемещения должны использовать определяемую пользователем функцию без замены.
Наивный оператор назначения копирования или перемещения, реализованный без использования функции подкачки, может следовать шаблону в этом коде:
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 функции подкачки.
Polyspace ® помечает оператор назначения копирования или перемещения, если он не содержит хотя бы один вызов определяемой пользователем функции подкачки. Polyspace идентифицирует функции, имеющие эти подписи, как функции подкачки :void T::swap(T&) или void [N::]swap(T&, T&). Первая сигнатура представляет функцию-член класса T для этого требуется один аргумент. Вторая сигнатура представляет не являющуюся членом или статическую функцию в пространстве имен N для этого требуется два аргумента. Имя swap может быть без учета регистра и префиксом или постфиксированным подчеркиванием.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Специальные функции-члены |
| Категория: Консультации, Автоматизированные |