Они не противоречат друг другу. Поскольку scoped_ptr
является шаблоном и поскольку в коде нет явного создания экземпляра, каждый метод создается по требованию. Это означает, что тип должен быть завершен к моменту создания экземпляра ~scoped_ptr<>
, который в этом случае находится в файле .cpp после завершения удерживаемого типа (ищите example::~example(){}
рядом с концом файла, который где ~scoped_ptr<>
создается)
Это на самом деле интересный случай использования для деструктора, определенного пользователем, который выглядит точно так же, как сгенерированный компилятором, но позволяет вам контролировать , где / , когда происходит разрушение включить шаблон PIMPL с помощью некоторых интеллектуальных указателей. Если деструктор не был объявлен и определен, то деструктор будет неявно определен компилятором, где это необходимо, и тип будет неполным, что вызовет UB.