编写类时的一般准则(使用复制和交换习惯用法)是提供一个非抛出交换成员函数。(Effective C++,第 3 版,第 25 条和其他资源)
但是,如果因为我的班级使用不提供交换操作的第 3 方班级成员而无法提供 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 交换不能不抛出,因此交换失败的可能性很小。
注意:对于罕见的第 3 方课程,可以选择使用智能 ptr (pimpl),但是--
注意:CString 是一个很好的例子,因为他头脑正常(?)的人不会开始通过 pimpl(智能 ptr)持有概念上简单且无处不在的类的所有成员,例如 CString,因为这看起来真的很可怕——另一方面,没有(短期到中期)机会来修改 CString 以允许完全不抛出交换。
那么,如果你不能帮助它,是否可以有一个潜在的抛出交换成员函数?(或者你知道解决这个难题的方法吗?)
编辑:并且:如果不是强保证,是否可以将抛出交换成员与复制和交换习语一起使用以提供基本保证?