采用以下代码片段:
#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()
私有(private)或删除它,或放一个noexcept(false)
在上面,然后是 static_assert
会失败。
我怀疑gcc 4.7.2还没有实现析构函数隐式noexcept
的规则.
更新
我在回答上述问题时浏览了 CWG/LWG 问题,但遗漏了一个明显的问题:
http://cplusplus.github.com/LWG/lwg-active.html#2116
非常感谢 Cassio Neri 在下面指出这一点。我很抱歉没有自己捡起这个。我会删除这个答案,除非我认为它包含的信息可能有帮助。谢谢 Cassio Neri。
关于c++ - nothrow 在 C++11 中构造虚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15044802/