2012-08-15 45 views
10

不C++ 11提供有關inline函數或方法任何保證,當他們與noexcept詞聲明其他函數的調用?C++ 11 noexcept預選賽和聯方法

class My_String { ... 

    const char * c_str() const noexcept; 
    inline operator const char *() const { return c_str(); } 
}; 

我認爲一個優化編譯器可以自由地實現內聯方法沒有充分EH和堆棧展開,按照該noexcept資格。我也期望這一個簡單的存取方法太:

... inline operator const char *() const { return m_buffer; } 

雖然這個例子看起來微不足道,除了用來實現其他類或函數時,事情保證。 問: C++ 11標準是否解決了這個問題,或者應該將內聯方法標記爲noexcept?或者是否更好地省略noexcept,除非要求匹配類或函數規範?

編輯:爲了避免一些混淆:noexcept隱含的內聯方法?

+1

對於用戶提供的代碼,'noexcept'僅用於析構函數隱式的,如一個簡單的答案。 – 2012-08-15 12:35:44

+2

後續問題是:**應該在任何可能的情況下聲明'noexcept' ** – Walter 2012-08-15 13:06:50

回答

8

對不起,沒有。唯一隱含的例外規範是

  • 關於析構函數。
  • 在其他隱含聲明或明確違約的特殊成員函數:默認構造函數,複製和移動的構造,以及複製和移動作業,當一個類定義不聲明或= default;聲明。
  • 在釋放函數:operator deleteoperator delete[]

因此,無論是哪一種示例聲明,noexcept(static_cast<const char*>(std::declval<const MyString>()))必須是false。繼續寫下noexcept它可能很重要。

當然,正如你提到的,編譯器優化仍允許注意到一個內聯函數不能拋出異常,並在主叫方簡化異常處理。

+1

在* implicit'noexcept' *的列表中,您錯過了使用聲明/定義的析構函數隱式地爲'noexcept',除非用戶提供了不同的異常規範。這是C++ 11與C++ 03行爲的偏差。也就是說,用戶聲明析構函數像'T ::〜T(){throw 1; }'即使沒有其他異常處於活動狀態,也會終止程序(請注意缺少異常說明) – 2012-08-15 12:37:58

+0

掃描標準時,我確實錯過了,謝謝。 – aschepler 2012-08-15 12:42:16

+1

在原始答案中也錯過了:顯式默認特殊成員的行爲與隱含聲明相同。 – aschepler 2012-08-15 12:46:33