por qué declarar constructores constrexpr para clases con destructores no triviales (por ejemplo, unique_ptr, std :: variant)
Por lo que yo entiendo (al menos parac++14
), un destructor no puede serconstexpr
si no es trivial (generado implícitamente o=default
) ¿Cuál es el punto de declararconstexpr
constructores para estructuras con destructores no triviales?
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 ejemplostd::unique_ptr
Tiene algunosconstructores constexpr
(predeterminado ynullptr_t
), aunque el destructor está obviamente definido explícitamente (seguro que no tiene efectos si el objeto esnullptr
, pero eso no significa que todavía tiene un destructor definido explícitamente para verificar si el objeto está en un estado vacío, y como he visto, incluso un destructor vacío no permite que se use un objeto en una expresión de compilación constante)
Otro ejemplo es la propuesta destd :: variante: tiene casi todos los constructoresconstexpr
aunque el destructor tiene la firma~variant()
y tiene quecall get<T_j> *this).T_j::~T_j() with j being index().
¿Qué me estoy perdiendo?