зачем объявлять конструкторы constrexpr для классов с нетривиальными деструкторами (например, unique_ptr, std :: variable)

Насколько я понимаю (по крайней мере, дляc++14Деструктор не может бытьconstexpr если это не тривиально (неявно сгенерированный или=default). Какой смысл декларироватьconstexpr конструкторы для структур с нетривиальными деструкторами?

struct X {
  int a_;

  constexpr X(int a) : a_{a} {}

  // constexpr ~X(){}; // Error dtor cannot be marked constexpr
  // ~X(){}; // causes  error at y declaration: temporary of non-literal type ‘X’
             // in a constant expression .
};

template <int N> struct Y {};

int main() {
  Y<X{3}.a_> y; // OK only if the destructor is trivial
  (void)y;
}
// tested with c++14 g++-5.1.0 and clang++ 3.5.0

Напримерstd::unique_ptr имеет некоторыеконструкторы constexpr (по умолчанию иnullptr_t), хотя деструктор явно задан явно (уверен, что он не имеет эффекта, если объектnullptr, но это не значит, что у него все еще есть явно определенный деструктор, чтобы проверить, находится ли объект в пустом состоянии, и, как я видел, даже пустой деструктор не позволяет использовать объект в выражение константы компиляции)

Другим примером является предложение останд :: вариант: в нем есть почти все конструкторыconstexpr хотя деструктор имеет подпись~variant() и это должноcall get<T_j> *this).T_j::~T_j() with j being index().

Что мне не хватает?

Ответы на вопрос(1)

Ваш ответ на вопрос