2015-03-08 66 views
7

在C++中当按值抛出对象时抛出异常(),这会创建临时对象,它如何被引用捕获?我知道它的工作原理,但如果它是一个函数返回值或函数调用,它会失败,没有添加const类型,有什么区别?C++异常抛出值引用

+4

异常是不同的野兽,它们有它们自己的语义。 – 2015-03-08 21:36:50

+0

你能详细说明一下吗? – shd 2015-03-08 21:37:57

+0

这是一个很长的话题... 3小时的解释在这里:https://www.youtube.com/watch?v=W7fIy_54y-w IIRC,斯科特迈尔斯的书也有一些关于这个话题的章节...... – 2015-03-08 22:22:47

回答

6

首先,当你写

throw Exception(); 

什么东西被扔实际上不是由prvalue表达Exception()创建的临时对象。从概念上讲,有一个单独的对象 - 异常对象 - 从该临时对象初始化,它是实际抛出的异常对象。 (尽管编译器被允许删除复制/移动。)

其次,语言规则说异常对象总是被认为是左值。因此它可以绑定到非常量左值引用。