Per quanto comprendo (almeno per c++14
), un distruttore non può essere constexpr
se non è banale (implicito generato o =default
). Che senso ha dichiarare i costruttori constexpr
per strutture con distruttori non banali?perché dichiarare costruttori constrexpr per classi con distruttori non banali (es unique_ptr, std :: variante)
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
Per esempio std::unique_ptr
ha qualche constructorsconstexpr
(default e nullptr_t
), anche se il distruttore è ovviamente definita esplicitamente (certo non ha effetti se l'oggetto è nullptr
, ma non vuol dire che ha ancora un distruttore esplicitamente definito per verificare se l'oggetto si trova in uno stato vuoto e, come ho visto, anche un distruttore vuoto non consente l'utilizzo di un oggetto in un'espressione costante della compilazione)
Altro esempio è la proposta per std::variant: ha quasi tutti i costruttori constexpr
sebbene il distruttore ha la firma ~variant()
e deve call get<T_j> *this).T_j::~T_j() with j being index().
Cosa mi manca?
Vedi anche: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2976.html – dyp
Ti manca il fatto che C++ non ha più senso. –
inb4 lol @ "altro" –