【发布时间】:2016-02-17 17:36:04
【问题描述】:
刚开始做运算符重载,我的老师没有深入研究它们,所以我想知道为什么前缀/后缀递增/递减的返回类型不同。当我看到前缀重载时,返回类型写为 Type&,但后缀的返回类型写为 Type。我做了没有 & 的前缀,并且功能都正常运行。返回类型会影响任何东西还是只是区分前缀和后缀的另一种方式?
【问题讨论】:
标签: c++ operator-overloading prefix postfix-operator
刚开始做运算符重载,我的老师没有深入研究它们,所以我想知道为什么前缀/后缀递增/递减的返回类型不同。当我看到前缀重载时,返回类型写为 Type&,但后缀的返回类型写为 Type。我做了没有 & 的前缀,并且功能都正常运行。返回类型会影响任何东西还是只是区分前缀和后缀的另一种方式?
【问题讨论】:
标签: c++ operator-overloading prefix postfix-operator
原因是允许链接:
++ ++ ++ i;
要允许i 增加三倍,++ 必须返回引用并获取引用。如果它返回一个临时副本,则第二个++ 将增加...临时副本(实际上,临时副本不会绑定&,因此它甚至不会编译)。
【讨论】:
i++ + ++ i 的int 变量非常不同。
++ ++ ++ i 与op++(op++(op++(i))) 相同:评估顺序是唯一的。这不同于i++ + ++i,别名op+(op++(i,0), op++(i)),其中两个op+ 参数可以以任何顺序进行评估,用不同的历史修改i,从而给出一个UB。
要添加到 Emilio 的答案,后缀递增会创建一个临时变量并将其设置为 1 加上您想要递增的变量,其中前缀递增会递增实际变量,这在某些情况下可以提高性能。
【讨论】:
主要原因是遵循 C++ 中内置类型的语义,其中前缀递增/递减返回左值,后缀一返回右值。详情可见here
【讨论】: