首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11中虚类的nothrow构造

c++11中虚类的nothrow构造
EN

Stack Overflow用户
提问于 2013-02-24 03:43:29
回答 1查看 258关注 0票数 3

获取以下代码片段:

代码语言:javascript
复制
#include <type_traits>

struct X { virtual ~X(); };

static_assert(std::is_nothrow_default_constructible<X>::value, "fail");

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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在下面指出了这一点。我很抱歉没有亲自拿起这个。我会删除这个答案,除非我认为它包含的信息可能是有帮助的。谢谢你凯西奥·奈里。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15044802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档