考虑以下代码:
#include <type_traits>
struct T {};
static_assert(std::is_trivially_destructible< T >{});
static_assert(std::is_trivially_default_constructible< T >{});
struct N { ~N() { ; } };
static_assert(!std::is_trivially_destructible< N >{});
static_assert(!std::is_trivially_default_constructible< N >{});
使用
clang 3.7.0
:live example可以很好地编译。但是总结the Standard:如我所见,不依赖于析构函数的琐碎性。
我错过了什么吗?是
clang
错误吗?额外
我找到了一种解决方法:
static_assert(__has_trivial_constructor( N ));
内置类型特征。 clang
, gcc
和 MSVC
支持。对于特征类型为there is workaround的
is_noexcept_constructible
系列也是如此。 最佳答案
LWG issue 2116: std::swap noexcept(what?)涵盖了此问题,我们可以从std::is_trivially_default_constructible的cppreference部分中看到此问题:
从表面上讲,它只是在谈论is_nothrow_default_constructible
,但如果我们详细阅读此问题,我们也会发现它也适用于此。
如果遵循第一个引用的gcc bug report: [DR 2116] has_nothrow_.*constructor bugs,可能会更容易一些:
这明确地说明了LWG问题中真正提到的内容,最终指出:
这也影响依赖于std::is_trivially_constructible的std::is_trivially_default_constructible
,它与is_constructible
相同,但具有以下限制:
关于c++ - 非平凡的析构函数使类非平凡的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33909390/