0

这段摘录来自 Bjarne 的书:

原则上,异常在抛出时会被复制,因此处理程序会获取原始异常的副本。事实上,一个异常在被捕获之前可能会被复制多次。因此,我们不能抛出无法复制的异常。

如果我们通过引用或指针捕获异常,那么这不成立。我对吗?这里的作者是否意味着首先在内部复制抛出的对象,然后将该副本传递给处理程序参数,如果处理程序参数按值传递,则该副本将再次被复制

4

1 回答 1

2

无论异常是通过值还是引用捕获,它仍然是对象的副本。我可以推荐阅读 Meyers,更有效的 C++,第 12 项“了解抛出异常与传递参数或调用虚函数有何不同”,这对此有所了解。
即使 catch 处理程序通过引用捕获,该引用也必须是副本,因为原始对象可能已被破坏。
但是请注意,通过指针捕获不涉及复制 - 但抛出者负责确保捕获器获得指针的异常没有被破坏。不推荐使用指针捕捉。这只是 Meyers 通常建议始终通过引用捕获的原因之一,请参阅 Meyers,第 13 条“通过引用捕获异常”以供其他人使用!

于 2012-04-14T23:15:33.657 回答