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
.
#include class B; class A { std::unique_ptr myptr; // B::~B() can't be seen from here public: ~A(); };
#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
.)