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