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



为什么返回左值引用以及前缀递增/递减运算符的函数是左值表达式,而返回左值参考以及后缀递增/递减操作符的函数不是左值表达式?

C++引物,Lippman等人5/e提到:

返回左值引用的函数,以及赋值、下标、解引用和前缀递增/递减运算符,都是返回左值的表达式的示例。我们可以将左值引用绑定到这些表达式中任何一个的结果。

返回非引用类型的函数,以及算术运算符、关系运算符、位运算符和后缀递增/递减运算符,都会产生右值。我们不能将左值引用绑定到这些表达式,但我们可以将左值援引绑定到const,也可以将右值援引绑定到此表达式。*

我会尝试自己回答这个问题,并从@YSC得到一些提示。不确定其正确性。社区请帮助查看此答案。

在前缀的情况下:

返回值(它是一个引用(可以递增(通过使用重载前缀++运算符(,它本身将引用返回到可以分配的同一对象,从某种意义上说,该对象在整个前缀inc/dec操作中保持同一性,因此它产生一个左值表达式。

在后缀的情况下:

返回值和以前一样是一个引用,但现在必须复制对象(通过引用返回(,因为存在post-inc/dec运算符。

情况与情况类似:

int i; 
i+1 = j

i+1不是左值表达式。i+1没有标识(内存分配(,因此不能用作左值表达式。

问题

为什么返回左值引用以及前缀递增/递减运算符的函数是左值表达式,而返回左值参考以及后缀递增/递减操作符的函数不是左值表达式?

回答

因为标准是这么说的。

来自价值链的文档:

以下表达式是左值表达式:

  1. 函数调用或重载运算符表达式,其返回类型为左值引用
  • ++a--a内置的预增预减表达式
  • 类似地,

    以下表达式是prvalue表达式:

    1. 函数调用或重载运算符表达式,其返回类型为非引用
    1. a++a--,内置的后增量前减量表达式
    1. a + ba % ba & ba << b和所有其他内置的算术表达式

    最新更新