微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么返回带有前缀 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 没有标识(内存分配),因此不能用作左值表达式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。