考虑以下代码:

#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 workaroundis_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_constructiblestd::is_trivially_default_constructible,它与is_constructible相同,但具有以下限制:

关于c++ - 非平凡的析构函数使类非平凡的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33909390/

10-14 09:11