【发布时间】:2017-05-18 08:08:25
【问题描述】:
我确实理解为什么有时建议为给定的类实现我们自己的 swap() 函数。
例如,如果我们有一个遵循 pimpl 习语的类,我们可能希望定义自己的 复制构造函数,以便它执行 深度复制 作为参数传递的对象的内容,而不是 默认复制构造函数 执行的 浅复制。这同样适用于 复制赋值运算符。
因为std::swap() 似乎是根据(至少在涉及 C++03 时)复制构造函数和复制赋值运算符实现的>。对要交换的对象执行深拷贝是低效的,因为只需要交换这些对象包含的指针即可。
我的问题是为什么我们应该将swap() 函数实现为非抛出函数。
在上面解释的情况下,我假设它只是语义:因为没有分配新资源(即:两个现有指针只是被交换)。这种函数抛出异常没有多大意义。
但是,在这个推理中,我可能忽略了其他原因或场景。
【问题讨论】:
-
反问:如果没有必要,为什么要实现抛掷功能?必须处理异常。您必须决定要做什么,并在调用该函数时使用 try-catch 保护代码。这是一些工作。如果有办法完全避免它,为什么不呢?
-
1. 不投掷是什么意思?你的意思是
throw()? 2. 在问为什么 swap 不应该抛出之前,先问一下:should swap 应该不抛出吗? -
交换什么时候抛出?
-
我的意思是,函数从不抛出。不是
throw()作为函数签名的一部分。