Переслать объявление с unique_ptr?
Я нашел полезным использовать предварительное объявление классов в сочетании с std::unique_ptr
как в коде ниже. Он компилируется и работает с GCC, но все это кажется странным, и мне интересно, является ли это стандартным поведением (то есть требуемым стандартом)? Поскольку B не полный тип, когда я объявляю 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.
Я подозреваю, что это связано с деструктором (и, следовательно, необходимость вызова деструктора unique_ptr<B>
) определяется в определенном модуле компиляции (A.cpp).
1 ответ
Это явно законно. Правило состоит в том, что типы, используемые для создания экземпляра шаблона в стандартной библиотеке, должны быть полными, если не указано иное. В случае unique_ptr
В §20.7.1/5 сказано: "[...] Параметр шаблона T в unique_ptr может быть неполного типа".
Есть определенные операции над указателем, которые требуют полного типа; в частности, когда объект будет фактически уничтожен (по крайней мере, с помощью средства удаления по умолчанию). В вашем примере, например, еслиA::~A()
были встроены, это может вызвать проблемы. (Обратите внимание, что если вы не объявите деструктор самостоятельно, он будет встроен. Что частично противоречит цели использования std::unique_ptr
.)