Разъяснение по указателю на преобразование функции - PullRequest
3 голосов
/ 20 декабря 2011

Тип функции (lvalue) можно преобразовать в указатель на функцию (rvalue).

int func();
int (*func_ptr)() = func;

Но из (4.1 / 1)

Значение l (3.10) нефункционального типа, не являющегося массивом, можно преобразовать к значению.

Означает ли это, что преобразование lvalue в rvalue не выполняется для функций? Кроме того, когда массив распадается на указатель, он не возвращает значение, которое является указателем?

1 Ответ

3 голосов
/ 20 декабря 2011

Функции являются 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.

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