Рассмотрим следующий код:
#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
: живой пример. Но суммируя Стандарт:
Конструктор по умолчанию для класса T является тривиальным (т.е. не выполняет никаких действий), если выполняется все следующее:
- Конструктор не предоставляется пользователем (т.е. неявно определен или дефолт)
- T не имеет виртуальных функций-членов
- T не имеет виртуальных базовых классов
- T не имеет нестатических элементов с инициализаторами по умолчанию. (начиная с С++ 11)
- Каждая прямая база T имеет тривиальный конструктор по умолчанию
- Каждый нестатический член типа класса имеет тривиальный конструктор по умолчанию
Как я вижу, нет никакой зависимости от тривиальности деструктора.
Я что-то пропустил? Это ошибка clang
?
ДОПОЛНИТЕЛЬНОЕ
Я нашел обходное решение: static_assert(__has_trivial_constructor( N ));
встроенный тип. Существует поддержка в clang
, gcc
и MSVC
.
Для is_noexcept_constructible
семейства признаков типа также есть обход.