Общая рекомендация при написании классов (с использованием идиомы копирования и замены) заключается в предоставлении функции-члена без броска подкачки. ( Вступление в силу 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 swap не может быть выполнен без броска, так что есть вероятность, что своп не удастся.
Примечание: для редких сторонних классов можно использовать интеллектуальное ptr (pimpl), , но -
Примечание: CString - хороший пример, поскольку никто в здравом уме (?) Не начал бы удерживать всех членов концептуально простого и вездесущего класса, такого как CString, через pimpl (smart ptr), потому что это действительно выглядело бы ужасно - и на с другой стороны, нет (в краткосрочном и среднесрочном плане) шансов изменить CString, чтобы разрешить полный обмен без бросков.
Итак, нормально ли иметь потенциально вызывающую функцию-член подкачки, если вы не можете помочь ей ? (Или вы знаете пути решения этой головоломки?)
Редактировать: И: Можно ли использовать бросающий элемент обмена с идиомой копирования и обмена, чтобы обеспечить базовую гарантию, если не сильную гарантию?