gpt4 book ai didi

c++ - 有一个 throwing swap 成员实现可以吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:14 26 4
gpt4 key购买 nike

编写类(使用 copy-and-swap 习惯用法)时的一般准则是提供一个非抛出交换成员函数。 (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 方类,使用智能指针 (pimpl) 是一种选择,但是 --

注意:CString 是一个很好的例子,因为没有人(?)会开始通过 pimpl(智能指针)持有一个概念上简单且无处不在的类的所有成员,因为这看起来真的很糟糕——而且在另一方面,没有(短期到中期)修改 CString 以允许完全不抛出交换的机会。

那么,如果你忍不住,可以使用一个可能会抛出异常的 swap 成员函数吗? (或者您知道解决这个难题的方法吗?)

编辑:并且:抛出交换成员是否可以与 copy-and-swap 成语一起使用以提供基本保证(如果不是强保证)?

最佳答案

So, is it OK to have a potentially throwing swap member function if you can't help it? (Or do you know ways around this conundrum?)

拥有一个 swap 本身并没有什么错误可能会抛出异常的函数,但要注意在 swap 中没有强大的异常保证,它不可能用于提供异常安全,也就是说,它只能用作 swap (也就是说,忘记那个特定类的 copy-and-swap 习语作为提供强大的异常保证的一种方式......但你仍然可以使用它来减少代码量 - 并记录它不是异常安全)

或者,您可以移动 CString变成一个提供不抛出的智能指针swap (或者至少是强异常保证),这不是一个很好的解决方案,但它至少是异常安全的。最后,您可以离开 CString完全通过使用任何其他字符串库来提供您需要的任何内容并提供无抛出交换操作。

关于c++ - 有一个 throwing swap 成员实现可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7661392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com