por que declarar constrexpr construtores para classes com destruidores não triviais (por exemplo, unique_ptr, std :: variant)

Tanto quanto eu entendo (pelo menos porc++14), um destruidor não pode serconstexpr se não for trivial (gerado implícito ou=default) Qual é o sentido de declararconstexpr construtores para estruturas com destruidores não triviais?

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

Por exemplostd::unique_ptr tem algumconstrutores constexpr (padrão enullptr_t), mesmo que o destruidor esteja obviamente definido explicitamente (com certeza não terá efeito se o objeto fornullptr, mas isso não significa que ele ainda possui um destruidor definido explicitamente para verificar se o objeto está em um estado vazio e, como eu já vi, mesmo um destruidor vazio não permite que um objeto seja usado em uma expressão constante de compilação)

Outro exemplo é a proposta destd :: variant: tem quase todos os construtoresconstexpr embora o destruidor tenha a assinatura~variant() e tem quecall get<T_j> *this).T_j::~T_j() with j being index().

o que estou perdendo?

questionAnswers(1)

yourAnswerToTheQuestion