3

次のコード スニペットをご覧ください。

#include <type_traits>

struct X { virtual ~X(); };

static_assert(std::is_nothrow_default_constructible<X>::value, "fail");

clang svn の下では、正常にコンパイルされます。ただし、gcc 4.7.2 では、アサーションは失敗します。どちらが正しいですか?(gcc が正しければ、なぜですか?)

4

1 に答える 1

3

クランは正しいです。

これにはいくつかの論争がありましたが、オブジェクトの構築により、そのデストラクタが呼び出される可能性があります:

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1424

デフォルトのコンストラクターstd::is_nothrow_default_constructible<X>だけでなく、~X().

デフォルトで~X()は、 Implicitnoexceptが適用されています。あなたの例がそれを~X()プライベートにするか、削除するか、またはそれに置くとnoexcept(false)static_assertは失敗します。

gcc 4.7.2 は、デストラクタが暗黙的に存在するという規則をまだ実装していないと思われnoexceptます。

アップデート

上記に答えながら、CWG/LWG の問題を一掃しましたが、明らかなものを見逃していました。

http://cplusplus.github.com/LWG/lwg-active.html#2116

以下でこれを指摘してくれた Cassio Neri に感謝します。これを自分で拾わなかったことに対する罪悪感。含まれている情報がおそらく役立つと思われる場合を除いて、この回答を削除します。ありがとうカッシオ・ネリ。

于 2013-02-23T20:11:52.657 に答える