获取以下代码片段:
#include <type_traits>
struct X { virtual ~X(); };
static_assert(std::is_nothrow_default_constructible<X>::value, "fail");在clang svn下,它编译得很好。然而,在gcc 4.7.2中,断言失败。哪一个是正确的?(如果gcc是对的,为什么呢?)
发布于 2013-02-24 04:11:53
clang是正确的。
在这个问题上有一些争论,但对象的构造可能会导致其析构函数被调用
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),那么static_assert将失败。
我怀疑gcc 4.7.2还没有实现析构函数隐式noexcept的规则。
更新
在回答上述问题时,我大致介绍了CWG/LWG问题,但忽略了明显的问题:
http://cplusplus.github.com/LWG/lwg-active.html#2116
非常感谢Cassio Neri在下面指出了这一点。我很抱歉没有亲自拿起这个。我会删除这个答案,除非我认为它包含的信息可能是有帮助的。谢谢你凯西奥·奈里。
https://stackoverflow.com/questions/15044802
复制相似问题