4 votes

Un vecteur de type incomplet est-il autorisé si absolument aucune fonction membre n'est appelée ? Si oui, depuis quand ?

Supposons que j'ai un type incomplet

// in foo.hh
struct Hidden;

que je veux utiliser comme type d'élément d'une std::vector . L'utilisation d'un union Je peux "différer" les appels au(x) constructeur(s) et au destructeur de l'objet d'échange. std::vector à la mise en œuvre du ou des constructeurs/destructeurs des unions.

// in foo.hh
struct Public {
  union Defer {
    std::vector<Hidden> v;
    Defer();
    // add copy/move constructor if needed
    ~Defer();
  } d;
};

Maintenant je peux utiliser Public en incluant uniquement foo.hh et la liaison avec le(s) fichier(s) mis en œuvre Public::Defer::Defer() y Public::Defer::~Defer() . Seules les personnes qui auront besoin d'accéder à la définition complète des Hidden .

Est-ce que c'est du C++ légal ? Si oui, depuis quand ?

Le contexte : Question qui est apparue dans ma réponse à une autre question .

4voto

Igor Tandetnik Points 13562

Instanciation de std::vector<T> avec un type incomplet T est un comportement non défini jusqu'au C++14. En C++17, cette limitation est quelque peu assouplie :

[vecteur.aperçu]/3 Un type incomplet T peut être utilisé lors de l'instanciation de vector si l'allocateur satisfait aux exigences de complétude de l'allocateur de l'allocateur 17.6.3.5.1. T doit être complète avant que tout membre de la spécialisation résultante de vector est référencée.

(Remarque : l'allocateur par défaut std::allocator satisfait à ces exigences de complétude).

D'après ce que j'ai lu, avec C++17, il est légal pour une unité de traduction d'inclure votre en-tête (celui qui déclare à l'avance Hidden et définit Public ), et définir une variable Public pub; - mais pas d'utiliser réellement les membres de pub.d.v . Avant C++17, le simple fait d'inclure l'en-tête déclenchait déjà un comportement non défini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X