Переслать объявление с 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.)

Другие вопросы по тегам