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?