c++ - nothrow 在 C++11 中构造虚类

标签 c++ c++11 noexcept

采用以下代码片段:

#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/

相关文章:

c++ - C++ 中的 xvalue 是什么

c++ - cppcheck 在模板中使用时提示 unreadVariable

c++ - 为什么 `std::prev` 不会引发 `std::unordered_set` 迭代器的错误?

c++ - 浮点乘法可以在 C++ 中抛出异常吗?

c++ - 编译错误: error C2704: __va_start intrinsic only allowed in varargs?的含义

c++ - Fstream _Fgetc 访问冲突

c++ - 在编译时获取表达式的类型

c++ - 创建 is_primitive 或 is_inheritable 模板

c++ - noexcept 和可靠性保证

c++ - 将已删除的函数声明为 noexcept 有什么意义吗?