c++ - ¿Declaración hacia adelante con unique_ptr?
destructor forward-declaration (1)
Esta pregunta ya tiene una respuesta aquí:
Me ha resultado útil usar la declaración de clases hacia adelante en combinación con std::unique_ptr
como se std::unique_ptr
en el siguiente código. Se compila y funciona con GCC, pero todo parece un poco extraño, y me pregunto si este es un comportamiento estándar (es decir, requerido por el estándar). Dado que B no es un tipo completo cuando declaro el 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.
Sospecho que esto tiene que ver con el destructor (y, por lo tanto, la necesidad de llamar al destructor de unique_ptr<B>
) se define en una unidad de compilación específica (A.cpp).
Es explícitamente legal. La regla es que los tipos utilizados para crear una instancia de 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 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()
estaba 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 std::unique_ptr
parcialmente el propósito de usar std::unique_ptr
.)