Classes and class hierarchies
C.66
Сделайте операции перемещения `noexcept`
Причина
Перемещение, выбрасывающее исключение, нарушает разумные предположения большинства людей. Перемещение без исключений будет использовано более эффективно стандартными библиотечными и языковыми функциями.
Пример
template<typename T>
class Vector {
public:
Vector(Vector&& a) noexcept :elem{a.elem}, sz{a.sz} { a.elem = nullptr; a.sz = 0; }
Vector& operator=(Vector&& a) noexcept {
if (&a != this) {
delete elem;
elem = a.elem; a.elem = nullptr;
sz = a.sz; a.sz = 0;
}
return *this;
}
// ...
private:
T* elem;
int sz;
};
Эти операции не выбрасывают исключения.
Пример, плохо
template<typename T>
class Vector2 {
public:
Vector2(Vector2&& a) noexcept { *this = a; } // просто используйте копию
Vector2& operator=(Vector2&& a) noexcept { *this = a; } // просто используйте копию
// ...
private:
T* elem;
int sz;
};
Этот Vector2 не просто неэффективен, но так как копирование вектора требует выделения памяти, оно может выбросить исключение.
Применение
(Простое) Операция перемещения должна быть помечена как noexcept.