Я пытаюсь написать запрещенный тип кучи, т. Е. Тип, который нельзя построить на выделенной памяти кучи. После удаления оператора new и размещения new я думал, что достигну этого. Но создание общего указателя с использованием std::make_shared
все еще компилируется.
Почему std::make_shared<A>()
не удается скомпилировать при удалении новых операторов?
#include <memory>
class A {
public:
void* operator new(size_t) = delete;
void* operator new(size_t, void*) = delete;
void* operator new [] (size_t) = delete;
};
// Regular new fails
A* a1 = new A();
// Placement new fails
void* pv = std::malloc(sizeof(A));
A* a2 = new (pv) A();
// make_shared works
std::shared_ptr<A> a3 = std::make_shared<A>();