90 votes

Déclaration en avant avec unique_ptr ?

J'ai trouvé utile d'utiliser la déclaration anticipée des classes en combinaison avec std::unique_ptr comme dans le code ci-dessous. Il compile et fonctionne avec GCC, mais l'ensemble semble un peu étrange, et je me demande si c'est un comportement standard (c'est-à-dire requis par la norme) ? Puisque B n'est pas un type complet lorsque je déclare la fonction unique_ptr .

A.hpp

#include <memory>

class B;

class A {
    std::unique_ptr<B> myptr;
    // B::~B() can't be seen from here
public:
    ~A();
};

A.cpp

#include "B.hpp"
//B.hpp has to be included, otherwise it doesn't work.

A::~A() = default; // without this line, it won't compile 
// however, any destructor definiton will do.

Je soupçonne que cela a à voir avec le destructeur (et donc la nécessité d'appeler le destructeur de l'utilisateur). unique_ptr<B> ) est défini dans une unité de compilation spécifique (A.cpp).

97voto

James Kanze Points 96599

C'est explicitement légal. La règle est que les types utilisés pour instancier un modèle dans la bibliothèque standard doivent être complets, sauf si sinon spécifié. Dans le cas de unique_ptr Le §20.7.1/5 indique que "[...] le paramètre de modèle T paramètre de gabarit T de unique_ptr peut être un type incomplet".

Il y a certaines opérations sur le pointeur qui requièrent une analyse complète de l'information. complet ; en particulier, quand l'objet sera effectivement détruit (au moins avec la méthode au moins avec le suppresseur par défaut). Dans votre exemple, par exemple, si A::~A() étaient en ligne, cela pourrait poser des problèmes. (Notez que si vous ne déclarez pas vous-même le destructeur, il sera inline. Lequel va partiellement à l'encontre de l'objectif de l'utilisation de std::unique_ptr .)

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