12

C ++ 11は、修飾子inlineで宣言された他の関数を呼び出すときに、関数またはメソッドに関する保証を提供しますか?noexcept

class My_String { ...

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

最適化コンパイラは、noexcept資格に従って、完全なEHとスタックの巻き戻しなしでインラインメソッドを自由に実装できると思います。単純なアクセサーメソッドでもこれを期待します。

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

この例は些細なことのように見えますが、他のクラスや関数を実装するために使用する場合は、例外の保証が重要になります。Q: C ++ 11標準はこれに対応していますか、それともインラインメソッドにマークを付ける必要がありnoexceptますか?または、クラスまたは関数の仕様に一致する必要noexceptがない限り、省略する方がよいでしょうか。

編集:混乱を避けるために:noexceptインラインメソッドには暗黙的ですか?

4

1 に答える 1

9

申し訳ありません。唯一の暗黙の例外仕様は

  • デストラクタについて。
  • その他の暗黙的に宣言された、または明示的にデフォルト化された特殊メンバー関数:デフォルトのコンストラクター、コンストラクターのコピーと移動、およびクラス定義で宣言されていない場合、またはで宣言された場合の割り当てのコピーと移動= default;
  • 割り当て解除機能について:operator deleteおよびoperator delete[]

[割り当て解除関数の場合、暗黙的な例外指定は常にのようになることに注意してくださいnoexcept(true)。すべてのデストラクタ、および最初の宣言で暗黙的に宣言または明示的にデフォルト設定される特殊メンバー関数の場合、任意の基本クラスおよびメンバーの対応する特殊メンバー関数の例外仕様から決定されるように、暗黙の例外仕様はまたはのいずれnoexcept(true)かになります。noexcept(false)クラスタイプの。]

したがって、どちらの宣言例でも、はでnoexcept(static_cast<const char*>(std::declval<const MyString>()))ある必要がありますfalse。先に進んでnoexcept、それが重要になるかもしれないところに書いてください。

もちろん、ご指摘のとおり、コンパイラの最適化では、インライン関数が例外をスローできず、呼び出し元での例外処理を簡素化できないことに気付くことができます。

于 2012-08-15T12:30:29.307 に答える