Question Pourquoi déclarer des constructeurs constrexpr pour des classes avec des destructeurs non triviaux (par exemple, unique_ptr, std :: variant)


Pour autant que je comprenne (au moins pour c++14), un destructeur ne peut pas être constexpr si ce n'est pas trivial (implicite généré ou =default). Quel est l'intérêt de déclarer constexpr constructeurs de structures avec des destructeurs non triviaux?

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

Par exemple std::unique_ptr a quelques constructeurs  constexpr (par défaut et nullptr_t), même si le destructeur est clairement défini explicitement (assurez-vous qu'il n'a aucun effet si l'objet est nullptr, mais cela ne signifie-t-il pas qu'il a toujours un destructeur défini explicitement pour vérifier si l'objet est dans un état vide, et comme je l'ai vu, même un destructeur vide ne permet pas à un objet d'être utilisé dans une expression constante de compilation)

Un autre exemple est la proposition de std :: variant: il a presque tous les constructeurs constexpr bien que le destructeur ait la signature ~variant() et il doit call get<T_j> *this).T_j::~T_j() with j being index().

Qu'est-ce que je rate?


17
2018-06-10 19:57


origine


Réponses:


constexpr Les constructeurs peuvent être utilisés pour une initialisation constante, ce qui, sous la forme d'une initialisation statique, est garanti avant toute initialisation dynamique.

Par exemple, étant donné un global std::mutex:

std::mutex mutex;

Dans une implémentation conforme (lire: pas MSVC), les constructeurs d’autres objets peuvent verrouiller et déverrouiller en toute sécurité mutex, car std::mutexle constructeur est constexpr.


16
2018-06-10 20:15