Можно ли создать указатель функции на «новый» оператор/конструктор функции?

Если бы я хотел параметризовать создание объекта, я, конечно, мог бы создать функцию, которая вызывала бы new для определенного класса и передавала бы указатель. Мне интересно, можно ли пропустить этот шаг и передать указатель функции самому оператору new.


person Catskul    schedule 07.07.2011    source источник
comment
pass a pointer to the new operator itself, Что?!?   -  person karlphillip    schedule 07.07.2011
comment
New — это оператор, который ведет себя как функция, которая возвращает указатель на объект, который вы создаете. Концептуально (если не на самом деле) должна быть возможность создать указатель на функцию и передать его, например, в качестве аргумента функции.   -  person Catskul    schedule 07.07.2011
comment
Так же, как вы думаете, вы бы: void* (*np) (size_t) = &::operator new;. Мне кажется, или вопросы со временем становятся все более и более византийскими? Бонусный вопрос: что происходит, когда вы delete np;?   -  person Kerrek SB    schedule 07.07.2011
comment
@Kerrek, хм, интересно. Я полагаю, я должен был сказать новый оператор функции.   -  person Catskul    schedule 07.07.2011


Ответы (2)


boost::lambda предоставляет функциональные оболочки для new и delete. Их можно использовать для простого преобразования вызова new в объект функции.

person bdonlan    schedule 07.07.2011

operator new (как и другие варианты) занимается выделением памяти, но не создает объекты. На самом деле его возвращаемый тип — void*. Объект создается новым выражением, которое является частью языка, а не функцией. Таким образом, невозможно сформировать указатель или ссылку на него; это так же бессмысленно, как формировать ссылку на return.

person Luc Danton    schedule 07.07.2011
comment
Возможно, это невозможно, но уж точно не так бессмысленно, как создание ссылки на return. - person Catskul; 07.07.2011
comment
Ну, обычно вы использовали бы свой собственный новый указатель для выделения, а затем передавали результат в выражение нового размещения... это не совсем неслыханно. - person Kerrek SB; 07.07.2011
comment
@Catskul Вы не можете создать ссылку на функцию, которая не является функцией. Вот что бессмысленно. - person Luc Danton; 07.07.2011
comment
@Kerrek Обратите внимание, что это все еще новое выражение, создающее объект. И вы не можете сформировать ссылку на него, потому что это не функция. - person Luc Danton; 07.07.2011
comment
@Luc: да, конечно, вы не можете ссылаться на процесс создания объекта. Я не совсем уверен, чего пытается достичь ОП. - person Kerrek SB; 07.07.2011
comment
@ Люк Я не согласен, но концептуально в этом есть смысл. Фактически за сценой вызываются функции, malloc и, конечно же, конструктор. - person Catskul; 07.07.2011
comment
@Catskul Вы можете сказать это почти о каждом возможном выражении: в конце концов, в большинстве программ функции вызываются. Но позвольте мне уточнить; когда я говорю, что это бессмысленно, я имею в виду, что это бессмысленно согласно правилам языка. Например, std::vector<42> не имеет смысла. Это не было задумано как комментарий к тому, чего вы пытаетесь достичь, или к себе. - person Luc Danton; 07.07.2011