2010-12-06 39 views
3

C++中的編譯器可以重新排序變量設置和throw() op嗎?或者,標準的C++ 14882-1998允許或禁止該轉換的編譯器?C++中的序列點和異常

對於代碼:

bool funct() 
{ 
    bool succeeded = false; 
    bool res_throw = false; 

     try { 
      throw("it"); 
      succeeded = true; 
     } 
     catch(...) { 
      res_throw = true; 
     } 

     cout << "Result of throw: " << res_throw << endl; 
     cout << "succeeded: " << succeeded << endl; 

    return succeeded; 
} 

的輸出可以是一個

Result of throw: true 
succeeded: true 

標準表示: 「[intro.execution]#7」:

修改對象。都是邊 影響,這是 狀態變化的執行環境

在執行順序稱爲序列點的某些指定的點,先前評估的所有副作用應完整及後續評估的無副作用應已發生

throw語句順序點?

回答

4

是的,有與throw語句關聯的序列點,因爲有一個序列點的結束聲明。

所以succeeded在你的例子中必須保持false

我沒有C++ 98標準,但在C++ 03標準:

1.9p16:有一個在每個全表達的完成一個順序點。

陳述是最簡單的一種「完整表達」,但該標準的措詞包括其他表達式,這些表達式在技術上並不是任何陳述的一部分。

4

分號是一個序列點。爲了澄清:之前succeeded設置爲true

編輯擲發生succeeded不會被設置爲true

+0

「分號是一個序列點」 - 請幫助我在標準14882(頁面或節號或節名稱)中找到它 – osgx 2010-12-06 17:44:33

+0

@osgx:「在完整表達式的評估結束時(§1.9/ 16) (完整表達式不是另一個表達式的子表達式。)「 – 2010-12-06 17:46:52