次のコード スニペットをご覧ください。
#include <type_traits>
struct X { virtual ~X(); };
static_assert(std::is_nothrow_default_constructible<X>::value, "fail");
clang svn の下では、正常にコンパイルされます。ただし、gcc 4.7.2 では、アサーションは失敗します。どちらが正しいですか?(gcc が正しければ、なぜですか?)
クランは正しいです。
これにはいくつかの論争がありましたが、オブジェクトの構築により、そのデストラクタが呼び出される可能性があります:
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 に感謝します。これを自分で拾わなかったことに対する罪悪感。含まれている情報がおそらく役立つと思われる場合を除いて、この回答を削除します。ありがとうカッシオ・ネリ。