gpt4 book ai didi

c++ - 为什么将 swap() 实现为非抛出

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:23 24 4
gpt4 key购买 nike

我确实理解为什么有时建议为给定类实现我们自己的 swap() 函数。

例如,如果我们有一个遵循 pimpl 习语的类,我们可能希望定义我们自己的复制构造函数,以便它执行深复制 对象的内容作为参数传递,而不是 默认复制构造函数 执行的浅复制。这同样适用于复制赋值运算符

因为看起来 std::swap() 是根据(至少,当涉及到 C++03 时)复制构造函数复制赋值运算符。执行要交换的对象的深拷贝是低效的,因为只需要交换这些对象包含的指针。

我的问题是为什么我们应该将swap() 函数实现为非抛出 函数。

在上面解释的情况下,我假设它只是关于语义:因为没有新的资源被分配(即:两个现有的指针只是被交换)。这样的函数抛出异常意义不大。

但是,我在这个推理中可能忽略了其他原因或场景。

最佳答案

My question is why we should implement our swap() function as a non-throwing one

  1. 因为 swap 如果它可能抛出则完全没用。

    考虑:您交换 两个实例,操作抛出。现在,他们处于什么状态?

    强有力的保证是在抛出异常时没有副作用,这意味着两个原始对象都保留在其原始状态。

    如果我们不能满足强保证,在很多情况下我们就不能使用swap,因为没有办法从失败中有效地恢复,并且根本没有必要编写那个版本的 swap

  2. 因为它没有理由抛出。

    swap 的简单实现(现在)使用移动赋值和构造。

    移动构造函数通常没有理由抛出:它不分配任何新的东西,它只是重新安置现有数据。移动赋值通常没有理由抛出(如上所述),并且析构函数永远不应该抛出 - 这些是唯一需要的操作。

关于c++ - 为什么将 swap() 实现为非抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44042043/

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