采取以下代码片段:
#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()
了隐式noexcept
。如果您的示例将其设为~X()
私有或将其删除,或者noexcept(false)
在其上添加 a,则该示例static_assert
将失败。
我怀疑 gcc 4.7.2 还没有实现隐式析构函数的规则noexcept
。
更新
在回答上述问题时,我对 CWG/LWG 问题进行了扫描,但忽略了一个明显的问题:
http://cplusplus.github.com/LWG/lwg-active.html#2116
非常感谢 Cassio Neri 在下面指出这一点。我自己没有捡到这个是我的过失。我会删除这个答案,但我认为它包含的信息可能会有所帮助。谢谢卡西奥·内里。