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