2016-03-21 12 views
6

次のコードでは、アサーションが発生しないはずだと思っていましたが、throwingデストラクタを持つクラスを返す関数の例外を除いて

struct A 
{ 
    ~A() noexcept(false); 
}; 

A f() noexcept; 

int main() 
{ 
    static_assert(noexcept(f()), "f must be noexcept"); 
} 

機能f()は明らかにnoexceptですが、noexcept(f())はfalseに評価されます。 (gccとclangの両方)

私に何か不足しているか、それともバグですか?

答えて

4

enoexcept演算子は、式の潜在的な例外が空であるかどうかを示します。

e場合は、暗黙的に、そのようなオーバーロード演算子、新規作成に割り当て関数として1つ以上の機能を(呼び出し:/(13.2)[except.spec]に従って、このセットは、デストラクタの潜在的な例外が含まれてい表現、またはデストラクタeは、フルの式(1.9))であれば、Sがの労働組合である:[...]このようなすべての関数の例外仕様のタイプのセット

+0

されていますこれはC++ 17のドラフトですか?私はC++ 14標準であなたのパッセージを見つけることができません。 – Simple

+0

@シンプル:はい、頭からです。良い質問、私はこの最後の変更時を知らない。 –

+0

@Simple:2016年2月の会議で不具合報告として受け入れられた[CWG 1992](http://wg21.link/cwg1992)の決議の一部として表現が追加されたように見えます。欠陥があるということは、以前のすべてのリビジョンについて遡及的に修正される可能性があることを意味します。 –