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()了隐式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 在下面指出这一点。我自己没有捡到这个是我的过失。我会删除这个答案,但我认为它包含的信息可能会有所帮助。谢谢卡西奥·内里。

于 2013-02-23T20:11:52.657 回答