В С++ оператор pre-increment дает lvalue, потому что возвращается сам экземпляр объекта, а не копия. Но в C он дает rvalue. Зачем?
Почему оператор pre-increment дает rvalue в C?
Ответ 1
C не имеет ссылок. В С++ ++i
возвращается ссылка на i
(lvalue), тогда как в C она возвращает копию (увеличивается).
C99 6.5.3.1/2
Значение операнда оператора pre fi x ++ увеличивается. Результат - новое значение операнда после инкремента. Выражение ++ Eis эквивалентно (E + = 1).
‘‘value of an expression’’ <=> rvalue
Однако по историческим причинам я считаю, что "ссылки, не являющиеся частью C", могут быть возможной причиной.
Ответ 2
C99 говорит в сноске (раздел 6.3.2.1),
Первоначальное имя 'lvalue из выражения присваивания E1 = E2, в котором левый операнд E1 равен должен быть (модифицируемым) значением l. Это, пожалуй, лучше рассматривать как представляющий объект "локатор" стоимость. То, что иногда называют 'Rvalue находится в этом Интернационале Стандарт описывается как "значение выражение.
Надеюсь, что это объясняет, почему ++i
в C возвращает rvalue.
Что касается С++, я бы сказал, что это зависит от возрастающего объекта. Если тип объекта - это определенный пользователем тип, он всегда может возвращать значение lvalue. Это означает, что вы всегда можете написать i++++++++
или ++++++i
, если тип i
равен Index
, как определено здесь:
Undefined поведение и точки последовательности перезагружены
Ответ 3
Сверху моей головы я не могу представить никаких полезных утверждений, которые могут возникнуть в результате использования переменной pre-incremented как lvalue. В С++ из-за существования перегрузки оператора я могу. У вас есть конкретный пример того, что вам запрещено делать на C из-за этого ограничения?