Общая рекомендация при написании классов (с использованием идиомы копирования и подкачки) состоит в том, чтобы предоставить функцию члена подкачки без выбрасывания. (Effective C++, 3-е издание, пункт 25 и другие ресурсы)
Однако что, если я не могу предоставить гарантию nothrow, потому что мой класс использует сторонний член класса, который не обеспечивает операцию обмена?
// Warning: Toy code !!!
class NumberBuffer {
public:
...
void swap(NumberBuffer& rhs);
public:
float* m_data;
size_t m_n;
CString m_desc;
};
void swap(NumberBuffer& lhs, NumberBuffer& rhs) {
lhs.swap(rhs);
}
void NumberBuffer::swap(NumberBuffer& rhs) {
using std::swap;
swap(m_data, rhs.m_data);
swap(m_n, rhs.m_n);
swap(m_desc, rhs.m_desc); // could throw if CString IsLocked and out-of-mem
}
Обмен CString не может быть выполнен без броска, поэтому есть вероятность, что обмен может завершиться ошибкой.
Примечание. Для редких сторонних курсов можно использовать интеллектуальный указатель указателя мыши (pimpl), но --
Примечание: CString — хороший пример, так как никто в здравом уме (?) не стал бы удерживать все члены концептуально простого и вездесущего класса, такого как CString, через pimpl (smart ptr), потому что это действительно выглядело бы ужасно — и, с другой стороны, нет (от краткосрочного до среднесрочного) шанса изменить CString, чтобы разрешить полный обмен без выбрасывания.
Итак, нормально ли иметь функцию-член swap, которая может выдать исключение, если вы ничего не можете с этим поделать? (Или вы знаете способы обойти эту головоломку?)
Редактировать: И: Можно ли использовать метательный элемент подкачки с идиомой копирования и подкачки, чтобы обеспечить базовую гарантию, если не сильную гарантию?
CString
, то проблема исчезнет... - person David Rodríguez - dribeas   schedule 05.10.2011