編寫類(使用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移動時遇到同樣的問題。如果成員不能不交換,那麼它有可能不會是不可移動的,因爲兩者非常相似。 –