Что означает примечание ниже в [expr.reinterpret.cast] / 6? - PullRequest
0 голосов
/ 09 декабря 2018

[expr.reinterpret.cast] / 6 :

Указатель функции может быть явно преобразован в указатель функции другого типа.[ Примечание. Эффект вызова функции через указатель на тип функции ([dcl.fct]), который отличается от типа, используемого в определении функции, не определен.- примечание конца ] За исключением того, что преобразование значения типа «указатель на T1» в тип «указатель на T2» (где T1 и T2 являются типами функций) и обратно в его исходный тип дает исходное значение указателя, результато таком преобразовании указателя не уточняется.[Примечание: Смотрите также [conv.ptr] для более подробной информации о преобразованиях указателя.- конец заметки]

Мне кажется, что в этой заметке говорится, что следующий фрагмент (см. demo ) имеет неопределенное поведение.Это правильно?Или кроме этого есть что-то еще?

#include<iostream>
void f() { std::cout << "function returning void\n"; }
int g() { std::cout << "function returning int\n"; return 1; }

int main(){
    void (*pf)() = f;
    reinterpret_cast<int(*)()>(pf)();
}

1 Ответ

0 голосов
/ 09 декабря 2018

Смысл примечания в том, что указатель функции может быть преобразован, но результат не может быть использован.Тем не менее, результат может быть преобразован обратно в исходный тип перед использованием.Идея состоит в том, чтобы хранить один из нескольких типов указателей на функции в одной переменной (не требуя union) вместе с тегом, который (каким-то образом) указывает на фактический тип функции.

Обратите внимание, что вы не можете переносить преобразованиеуказатель функции на указатель объекта ( например , void*) вообще.Однако POSIX предполагает, что вы можете сделать это , поэтому он очень часто работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...