lvalue и rvalue для пре / постфиксного приращения

Изучение lvalue и rvalue. Определение: все, что может быть "адресом", является левым значением, а в противном случае - rvalue.

Я проверил приоритет оператора, приращение префикса и постфикса имеет более высокий приоритет, чем оператор "адрес".

В следующих двух примерах кто-нибудь может немного объяснить, почему первое «& ++ value1» является lvalue, а второе «& value1 ++» - rvalue.

Мое неправильное понимание для обоих случаев: pValue1 указывает на переменную value1. Независимо от того, изменилось ли значение value1 на 8 до или после построения корреляции адресов, переменная value1 всегда занимает одну ячейку памяти, и мы можем получить ее адрес, верно?

int value1=7;

int *pValue1=&++value1;

int *pValue1 = &value1++;

person WriteBackCMO    schedule 07.09.2017    source источник
comment
postfix operator++ возвращает предварительно увеличенную копию, а не ссылку на увеличенный объект   -  person Fureeish    schedule 08.09.2017
comment
Не имеет прямого отношения, но ваше определение lvalue является неполным. Битовые поля - это lvalue, но вы не можете получить их адреса.   -  person HolyBlackCat    schedule 08.09.2017


Ответы (1)


Основываясь на моем комментарии, вы можете понять, почему компилятор против такого рода операций. Проблема заключается в общей реализации постфикса operator ++, который копирует объект (в данном случае int), увеличивает исходный объект и возвращает эту предварительно увеличенную копию. Вы можете думать об этом как о функции, которая определяется следующим образом:

int foo_operator(int& a)
{
    int copy = a;
    a += 1;
    return copy;
}

Если вы попытаетесь использовать эту функцию в своем примере, ваш компилятор также будет протестовать против нее. Возвращаемое значение этой функции - rvalue.

Теперь вы можете спросить - что случилось с префиксом operator ++? Разве это не функция, которая возвращает значение? И ответ будет - нет. Префикс operator ++ возвращает ссылку, а не скопированное значение, поэтому его «результат» можно использовать с операндом &.

person Fureeish    schedule 07.09.2017
comment
В частности, i++ - это выражение prvalue. - person wally; 30.04.2019