【发布时间】:2012-04-26 20:04:06
【问题描述】:
这段摘自 Bjarne 的书:
原则上,异常在抛出时会被复制,因此处理程序会获取原始异常的副本。事实上,一个异常在被捕获之前可能会被复制多次。因此,我们不能抛出无法复制的异常。
如果我们通过引用或指针捕获异常,那么这不成立。我对吗? 这里的作者是否意味着首先在内部复制抛出的对象并将该副本传递给处理程序参数,如果处理程序参数按值传递,则将再次复制该副本
【问题讨论】:
这段摘自 Bjarne 的书:
原则上,异常在抛出时会被复制,因此处理程序会获取原始异常的副本。事实上,一个异常在被捕获之前可能会被复制多次。因此,我们不能抛出无法复制的异常。
如果我们通过引用或指针捕获异常,那么这不成立。我对吗? 这里的作者是否意味着首先在内部复制抛出的对象并将该副本传递给处理程序参数,如果处理程序参数按值传递,则将再次复制该副本
【问题讨论】:
无论异常是由值还是引用捕获,它仍然是对象的副本。我可以推荐阅读 Meyers,更有效的 C++,第 12 项“了解抛出异常与传递参数或调用虚函数有何不同”,这对此有所了解。
即使 catch 处理程序通过引用捕获,该引用也必须是副本,因为原始对象可能已被破坏。
但是请注意,通过指针捕获不涉及副本 - 但抛出者负责确保捕获者获得指向的指针的异常没有被破坏。不推荐使用指针捕捉。这只是 Meyers 通常建议始终通过引用捕获的原因之一,请参阅 Meyers,第 13 条“通过引用捕获异常”供其他人使用!
【讨论】: