问题描述
为什么返回左值引用和前缀递增/递减运算符的函数是左值表达式,而返回左值引用和后缀递增/递减运算符的函数不是左值表达式?
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 没有标识(内存分配),因此不能用作左值表达式。