Почему static_cast от int (*) (int) до void * не разрешен в C ++? - PullRequest
2 голосов
/ 13 марта 2020

Пожалуйста, рассмотрите следующий код:

int f(int i){return i*i;};

int main() {

    void* p = static_cast<void*>(&f);

    return 0;
}

Как вы можете см. Здесь код не компилируется. Почему static_cast с int (*)(int) до void* не разрешено в C ++?

1 Ответ

5 голосов
/ 13 марта 2020

Нельзя привести указатель функции к void* с помощью static_cast, но вы можете сделать это с помощью reinterpret_cast.

Это с условной поддержкой с помощью семантика , определяемая реализацией, за исключением того, что приведение к исходному типу указателя на функцию приводит к тому же значению указателя, так что его можно использовать снова для вызова функции.

Возможно, вам не разрешено чтобы сделать что-то еще с void*, полученным таким способом, но вам нужно будет посмотреть документацию компилятора, чтобы определить это. (Компиляторы должны документировать поведение, определяемое реализацией, но зачастую оно не выполняется должным образом или вовсе.)

Особенно в системах POSIX, и Windows это приведение всегда поддерживается.

...