c++11中虚拟类的另一种构造方法

nothrow construction of virtual classes in c++11

本文关键字:另一种 构造方法 虚拟 c++11      更新时间:2023-10-16

获取以下代码片段:

#include <type_traits>
struct X { virtual ~X(); };
static_assert(std::is_nothrow_default_constructible<X>::value, "fail");

在clang-svn下,它编译得很好。但是,对于gcc 4.7.2,断言失败。哪一个是正确的?(如果gcc是对的,为什么?)

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

非常感谢卡西奥·内里在下面指出这一点。我很抱歉我自己没有把这个捡起来。我会删除这个答案,只是我认为它所包含的信息可能会有所帮助。谢谢你卡西奥·内里。