【发布时间】:2011-12-01 11:05:07
【问题描述】:
编写类时的一般准则(使用复制和交换习惯用法)是提供非抛出交换成员函数。 (Effective C++, 3rd edition, Item 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 (smart ptr) 来持有概念上简单且无处不在的类的所有成员,例如 CString,因为这看起来真的很可怕——而且在另一方面,没有(短期到中期)机会修改 CString 以允许完全无抛出交换。
那么,如果你帮不上忙,是否可以有一个潜在的抛出交换成员函数? (或者你知道解决这个难题的方法吗?)
编辑:并且:如果不是强保证,是否可以将 throwing swap 成员与 copy-and-swap 习语一起使用以提供基本保证?
【问题讨论】:
-
不是一个答案,但如果你能离开
CString,那么问题就会消失...... -
请注意,在类似的主题上,当您尝试为您的班级实施 C++11 迁移时,您将在相当短的几年后遇到同样的问题。如果成员不能被 nothrow-swapped,那么它很可能也不会是 nothrow-movable,因为两者非常相似。
标签: c++ swap exception-safe copy-and-swap exception-safety