Указатели на функции не являются обычными указателями данных, поскольку они не могут быть сохранены в указателе void *. Тем не менее, кажется, что я могу сохранить копию указателя функции в динамической памяти (в gcc и clang), как в коде ниже. Является ли такой код законным в соответствии со стандартом C ++, или, возможно, это своего рода расширение компилятора?
Более того, результирующий указатель на указатель на функцию ведет себя как простой указатель данных: я могу сохранить его в void * и извлечь его из void * с помощью static_cast. Это поведение гарантировано Стандартом?
int main()
{
extern void fcn();
void (*fcnPtr)() = &fcn;
void (**ptrToFcnPtr)() = nullptr;
//Make the copy of fcnPtr on the heap:
ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr);
//Call the pointed-to function :
(**ptrToFcnPtr)();
//Save the pointer in void* :
void *ptr = ptrToFcnPtr;
//retrieve the original ptr:
auto myPtr = static_cast< void(**)() > (ptr) ;
//free memory:
delete ptrToFcnPtr ;
}
newбросать на void*. void* ptr = &fcnPtr;работает так же хорошо, так fcnPtrкак это объект, а не функция.
std::function- это стертый контейнер для хранения произвольного вызываемого объекта, который на самом деле не является заменой для указателей на функции…
std::function. Он отлично подходит для хранения «полиморфных» функций (т. Е. Всего, что имеет правильную сигнатуру, даже если он содержит состояние, как в случае некоторых лямбд), но это также добавляет накладные расходы, которые могут не понадобиться. Указатель на функцию - это POD. А std::functionэто не так.
void*, поэтому в контексте этого вопроса, std::functionпохоже, именно то, что они искали. Я согласен с тем, что общее отклонение указателей функций SPD несостоятельно.
std::functionвместо этого.