Почему компиляция 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 не является проблемой?