2015-03-08 68 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()創建的臨時對象。從概念上講,有一個單獨的對象 - 異常對象 - 從該臨時對象初始化,它是實際拋出的異常對象。 (儘管編譯器被允許刪除複製/移動。)

其次,語言規則說異常對象總是被認爲是左值。因此它可以綁定到非常量左值引用。