Почему компиляция make_unique компилируется? Не make_unqiue требует, чтобы его аргумент шаблона был полным типом?
struct F;
int main()
{
std::make_unique<F>();
}
struct F {};
Вопрос, который был задан из моей "проблемы" с моей реализацией PIMPL:
Я понимаю, почему деструктор должен быть объявлен и определен пользователем внутри файла cpp для класса реализации (PIMPL).
Но перемещение конструктора класса, содержащего pimpl-, еще компилируется.
class Object
{};
class CachedObjectFactory
{
public:
CachedObjectFactory();
~CachedObjectFactory();
std::shared_ptr<Object> create(int id) const;
private:
struct CacheImpl;
std::unique_ptr<CacheImpl> pImpl;
};
Теперь файл cpp:
// constructor with make_unique on incompete type ?
CachedObjectFactory::CachedObjectFactory()
: pImpl(std::make_unique<CacheImpl>())
{}
struct CachedObjectFactory::CacheImpl
{
std::map<int, std::shared_ptr<Object>> idToObjects;
};
//deferred destructor
CachedObjectFactory::~CachedObjectFactory() = default;
Может кто-нибудь объяснить, почему это компилируется? Почему существует разница между строительством и разрушением? Если создание деструктора и создание экземпляра default_deleter является проблемой, почему создание make_unique не является проблемой?