c++11中虚拟类的另一种构造方法
nothrow construction of virtual classes in c++11
获取以下代码片段:
#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
非常感谢卡西奥·内里在下面指出这一点。我很抱歉我自己没有把这个捡起来。我会删除这个答案,只是我认为它所包含的信息可能会有所帮助。谢谢你卡西奥·内里。
相关文章:
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何在一种方法中创建对象并在另一种方法中使用它
- 常量静态成员函数:有另一种方法可用吗?
- 如何将程序从主发送到另一种方法
- 如何使用shared_ptr或推荐另一种方法(unique_ptr)
- 从另一个线程更新QT小部件的一种详细方法
- 在C++编程中继续下一行的另一种方法是什么?
- 是否有另一种方法可以在不使用宏定义的情况下进行此操作
- 将带有参数的void方法传递给使用std ::函数和std :: bind c 的另一种方法
- C++:访问由另一种方法返回的向量的常量向量时出现分段错误
- 一个人如何将腋窝VEC/MAT作为REF论点传递给另一种方法
- 从另一种基本方法调用Overriden方法
- Visual Studio 2003使用regex的另一种方法
- C++另一种方法计算平均值
- 在cuda中使用静态成员函数模板结构的另一种方法
- 另一种创建随机数的方法
- C++-使用循环的另一种方法
- 在C++03中初始化成员的另一种方法
- c++11中虚拟类的另一种构造方法