Как уже упоминалось, int (*)(int)
- это указатель типа на функцию, которая принимает и возвращает int
.Однако здесь отсутствует то, что делает это приведенное выражение: в отличие от других приведенных выражений, оно не действительно приводит (то есть не преобразует значение в другой тип), но выбирает из перегруженного набора функций с именем std::toupper
тот, который имеет сигнатуру int(int)
.
Обратите внимание, однако, что этот метод несколько хрупкий: если по какой-то причине нет соответствующей функции (например, потому чтосоответствующий заголовок не был включен), но только одна несовпадающая функция (поэтому не возникает двусмысленности), тогда это выражение приведения действительно превратится в приведение, точнее reinterpret_cast
, с нежелательными эффектами.Чтобы убедиться, что не произошло непреднамеренного приведения, вместо синтаксиса приведения в стиле C следует использовать синтаксис приведения в стиле C ++: static_cast<int(*)(int)>(std::toupper)
(на самом деле, в случае std::toupper
этот случай не может произойти, потому что единственная альтернативная функция является шаблонной ипоэтому неоднозначно, однако это может произойти с другими перегруженными функциями).
По совпадению, синтаксис приведения нового стиля также более читабелен в этом случае.
Еще одна возможность, которая работает без приведенияВыражение выглядит следующим образом:
int (*ptoupper)(int) = &std::toupper; // here the context provides the required type information
std::transform(myString.begin(), myString.end(), myString.begin(), ptoupper);
Обратите внимание, что причина, по которой контекст не может предоставить необходимую информацию, заключается в том, что std::transform
шаблонируется в последнем аргументе, поэтому компилятор не может определить правильную функцию для выбора.