Reenviar statement con unique_ptr?

He encontrado que es útil usar la statement de clases forward en combinación con std::unique_ptr como en el código a continuación. Comstack y trabaja con GCC, pero todo parece un tanto extraño, y me pregunto si esto es un comportamiento estándar (es decir, requerido por el estándar). Como B no es un tipo completo cuando declaro unique_ptr .

A.hpp

 #include  class B; class A { std::unique_ptr 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. 

Sospecho que esto tiene que ver con el destructor (y, por lo tanto, la necesidad de llamar al destructor de unique_ptr ) se define en una unidad de comstackción específica (A.cpp).

Es explícitamente legal. La regla es que los tipos utilizados para instanciar una plantilla en la biblioteca estándar deben estar completos, a menos que se especifique lo contrario. En el caso de unique_ptr , §20.7.1 / 5 dice “[…] El parámetro de la plantilla T de unique_ptr puede ser un tipo incompleto”.

Hay ciertas operaciones en el puntero que requieren un tipo completo; en particular, cuando el objeto realmente será destruido (al menos con el eliminador predeterminado). En su ejemplo, por ejemplo, si A::~A() estaban en línea, esto podría causar problemas. (Tenga en cuenta que si no declara el destructor usted mismo, estará en línea. Lo que parcialmente std::unique_ptr el propósito de usar std::unique_ptr .)