编写类(使用copy-and-swap idiom)时的一般指导原则是提供非抛出交换成员函数。 (Effective C++, 3rd edition, Item 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的交换不能进行无抛出,所以有关闭的机会,交换可能会失败。
注:对于罕见的第三方类,使用智能PTR(平普尔)将是一种选择,但 -
注:CString的是一个很好的例子,在他的脑子没有人会(?)通过pimpl(smart ptr)开始持有像CString这样的概念上简单而无处不在的类的所有成员,因为这看起来真的很糟糕 - 另一方面,没有(短期到中期)机会让CString被修改为允许完全无丢包交换。
那么,如果你不能帮助它,可以使用一个潜在的引用交换成员函数? (或者你知道解决这个难题的方法吗?)
编辑:和:一个投掷交换成员可以使用复制和交换成语提供基本保证,如果不是强有力的保证?
不是一个答案,但如果你可以离开'CString',那么问题就会消失... –
请注意,在类似的问题上,你会有一些相当短的年数当您尝试为您的课程实施C++ 11移动时遇到同样的问题。如果成员不能不交换,那么它有可能不会是不可移动的,因为两者非常相似。 –