Покажчики функцій не є простими покажчиками даних, оскільки вони не можуть бути збережені у покажчику недійсності *. Тим не менш, здається, що я можу зберігати копію вказівника функції в динамічній пам'яті (в gcc і clang), як у наведеному нижче коді. Чи законний такий код відповідно до стандарту C ++, чи, можливо, це якесь розширення компілятора?
Крім того, отриманий вказівник на функціональний покажчик поводиться як звичайний покажчик даних: я можу зберігати його в недійсності * та витягувати його з недійсності * 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замість цього.