为什么后缀运算符设计为按值返回?

kfm*_*e04 5 c++ operator-overloading c++11

特别是,前缀运算符的引用返回对我有意义 - 如果有人想对对象进行进一步的操作,它是有用的.

但是,我无法理解为什么后缀运算符被设计为按值返回.

它只是一个约定,还是有一个很好的理由为什么它是这样设计的(就像返回值对后缀没有意义,但对前缀有意义)?

谁能解释一下?

回答

由于下面的答案,似乎后缀运算符不一定必须按值返回(根据标准).

但是,由于后缀运算符的语义要求(返回原始值,但之后将引用增加到原始值),并结合以下标准要求:

操作符重载是函数,因此所有副作用必须在函数完成之前发生.

正如David Rodriguez在下面清楚解释的那样,将价值分叉似乎是语义要求的必然结果.

在这种情况下,由于我们返回另一个值(不是原始引用,因为它将通过函数的右括号更改),返回其他值by-value似乎最有意义.

Dav*_*eas 10

后缀运算符是表达式,它产生原始值然后修改对象.同时,操作符重载是函数,因此所有副作用必须在函数完成之前发生.获得所需语义的唯一方法是在应用更改之前复制对象的初始状态.必须通过值返回原始状态(如果返回引用,表达式的求值将在函数完成后产生对象的状态,因此将具有前缀运算符的语义,而不是后缀运算符的语义)


Alo*_*ave 5

这是约定,因为后修复的典型实现涉及创建函数本地的临时对象,同时使用前缀运算符递增最初传递的对象,然后返回临时对象.您不能返回对该本地对象的引用,因此需要按值返回.

您不能返回引用,因为本地对象只能在函数范围内保持活动状态,并且超出此范围的任何对它的访问都将导致未定义的行为.