Как понять какой части относится разыменовывание?
((int(*)(int, int))sum)(2,4);
(*(int(*)(int, int))sum)(2,4);
Я не понимаю,когда мы добавляем знак указателя,он относится к приведению типа или к разыменовыванию указателя на функцию? Просто я знаю что значок разыменовывания должен стоять вплотную к имени переменной,и тут у меня проблема.
Ответы (1 шт):
Воспользоваться таблицей приоритетов и ассоциативности операторов.
Приведения типа в C-стиле (new_type) expression имеет такой же приоритет как и оператор разыменовывания *. Однако, оба этих оператора имеют ассоциативность справа-налево.
Таким образом, выражение
(*(int(*)(int, int))sum)(2,4);
обрабатывается следующим образом:
sumявно приводится к типуint(*)(int, int). То естьsumявно приводится к указателю на функцию с двумя параметрами типаint, возвращающую значение типаint.- Указатель на функцию разыменовывается. Получаем lvalue, ссылающееся на эту функцию.
- Используем оператор вызова функции.
Просто я знаю что значок разыменовывания должен стоять вплотную к имени переменной
Если вы воспользуетесь reinterpret_cast, то увидите, что значок разыменовывания совсем не обязан стоять вплотную к имени переменной:
( *reinterpret_cast<int(*)(int, int)>(sum) )(2,4);