为什么返回带有前缀 inc/dec 运算符的引用的函数是左值表达式,而不是带有后缀 inc/dec 运算符的函数

问题描述

为什么返回左值引用和前缀递增/递减运算符的函数是左值表达式,而返回左值引用和后缀递增/递减运算符的函数不是左值表达式?

C++ 入门,Lippman 等。 5/e 提及:

返回左值引用的函数,连同赋值、下标、取消引用和前缀递增/递减运算符,都是返回左值的表达式示例。我们可以将左值引用绑定到任何这些表达式的结果。

返回非引用类型的函数,连同算术、关系、按位和后缀递增/递减运算符,都产生右值。我们无法将左值引用绑定到这些表达式,但我们可以将左值引用绑定到 const 或将右值引用绑定到此类表达式。*

解决方法

我会尝试用我从@YSC 得到的一些提示来回答这个问题。 不确定正确性。社区请帮助查看此答案。

在前缀的情况下:

返回值(它是一个引用)可以递增(通过使用重载前缀++运算符),它本身返回对同一个对象的引用,可以赋值,从某种意义上说,对象在整个过程中保持身份前缀 inc/dec 操作,因此它产生一个左值表达式。

在后缀的情况下:

返回值和以前一样是引用,但现在必须制作对象的副本(通过引用返回),因为有一个 post inc/dec 运算符。

情况类似:

(defn handle-trade [data {:keys [stock qty]}]
  (update-in data [stock :trades] running-decrease-trades qty))


user> (handle-trade
       {"STOCK1" {:trades [{:id 100,:qty 50} {:id 140,:qty 50}]}}
       {:stock "STOCK1" :qty 75})
{"STOCK1" {:trades ({:id 100,:qty 0} {:id 140,:qty 25})}}

i+1 不是左值表达式。 i+1 没有标识(内存分配),因此不能用作左值表达式。