Функции являются lvalues.Указатель на функцию (тип данных) может быть любым;если вы дадите ему имя, это lvalue;в противном случае это не так (грубо говоря).Указатели на функции подчиняются всем обычным правилам преобразования lvalue в rvalue.Для простых типов, таких как базовые типы или указатели, преобразование lvalue в rvalue в основном означает чтение переменной.
void func(); // Declares func
(*(&func))(); // The expression &func is an rvalue
void (*pf)() = &func; // pf is an lvalue
(*pf)(); // In the expression *pf, pf undergoes an
// lvalue to rvalue conversion
Обратите внимание, что существует неявное преобразование функции в указатель на функцию, и что ()
Оператор работает как с функциями, так и с указателями на функции, поэтому можно написать две последние строки:
void (*pf)() = func;
pf();
Как всегда, результатом преобразования является значение r (если преобразование не является ссылочным типом).Это также тот случай, когда массив неявно преобразуется в указатель;и массивы, и функции могут существовать только как lvalue, , но они оба неявно преобразуются в указатель, который является rvalue.Но этот указатель можно использовать для инициализации переменной соответствующего типа указателя;такие переменные являются lvalues.