【问题标题】:Why does Prefix Incrementor Overload return Type& instead of Type?为什么前缀增量重载返回类型而不是类型?
【发布时间】:2016-02-17 17:36:04
【问题描述】:

刚开始做运算符重载,我的老师没有深入研究它们,所以我想知道为什么前缀/后缀递增/递减的返回类型不同。当我看到前缀重载时,返回类型写为 Type&,但后缀的返回类型写为 Type。我做了没有 & 的前缀,并且功能都正常运行。返回类型会影响任何东西还是只是区分前缀和后缀的另一种方式?

【问题讨论】:

    标签: c++ operator-overloading prefix postfix-operator


    【解决方案1】:

    原因是允许链接:

    ++ ++ ++ i;
    

    要允许i 增加三倍,++ 必须返回引用并获取引用。如果它返回一个临时副本,则第二个++ 将增加...临时副本(实际上,临时副本不会绑定&,因此它甚至不会编译)。

    【讨论】:

    • @Slava - 不,用户定义的运算符涉及向表达式添加适当序列点的函数调用。这与i++ + ++ iint 变量非常不同。
    • 实际上,如果内置的链接前缀 UB 会带来有趣的问题。在这里问stackoverflow.com/questions/35464793/…
    • ++ ++ ++ iop++(op++(op++(i))) 相同:评估顺序是唯一的。这不同于i++ + ++i,别名op+(op++(i,0), op++(i)),其中两个op+ 参数可以以任何顺序进行评估,用不同的历史修改i,从而给出一个UB。
    【解决方案2】:

    要添加到 Emilio 的答案,后缀递增会创建一个临时变量并将其设置为 1 加上您想要递增的变量,其中前缀递增会递增实际变量,这在某些情况下可以提高性能。

    【讨论】:

      【解决方案3】:

      主要原因是遵循 C++ 中内置类型的语义,其中前缀递增/递减返回左值,后缀一返回右值。详情可见here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-09
        • 2020-07-24
        • 2010-10-24
        • 2015-12-08
        • 1970-01-01
        • 2013-10-01
        • 1970-01-01
        • 2016-07-22
        相关资源
        最近更新 更多