簡體   English   中英

為什么返回帶有前綴 inc/dec 運算符的引用的函數是左值表達式,而不是帶有后綴 inc/dec 運算符的函數

[英]Why are functions returning references with prefix inc/dec operators are lvalue expressions but not with postfix inc/dec operators

為什么返回左值引用以及前綴遞增/遞減運算符的函數是左值表達式,而返回左值引用以及后綴遞增/遞減運算符的函數不是左值表達式?

C++ 底漆,Lippman 等人。 5/e 提到:

返回左值引用的函數以及賦值、下標、取消引用和前綴遞增/遞減運算符都是返回左值的表達式的示例。 我們可以將左值引用綁定到任何這些表達式的結果。

返回非引用類型的函數以及算術、關系、按位和后綴遞增/遞減運算符都產生右值。 我們不能將左值引用綁定到這些表達式,但我們可以將左值引用綁定到 const 或將右值引用綁定到這些表達式。*

我會嘗試用我從@YSC 那里得到的一些提示來回答這個問題。 不確定正確性。 社區請幫助查看此答案。

在前綴的情況下:

返回值(這是一個引用)可以遞增(通過使用重載的前綴 ++ 運算符),它本身返回對相同 object 的引用,可以分配,在某種意義上,object 在整個前綴 inc/ 中保持身份dec 操作,因此它產生一個左值表達式。

在后綴的情況下:

返回值和以前一樣是一個引用,但現在必須制作 object 的副本(通過引用返回),因為有一個 post inc/dec 運算符。

情況與案例類似:

int i; 
i+1 = j

i+1 不是左值表達式。 i+1 沒有標識(內存分配),因此不能用作左值表達式。

問題

為什么返回左值引用以及前綴遞增/遞減運算符的函數是左值表達式,而返回左值引用以及后綴遞增/遞減運算符的函數不是左值表達式?

回答

因為標准是這樣說的。

來自價值類別的文檔

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

  1. function 調用或重載的運算符表達式,其返回類型為左值引用
  1. ++a--a內置的預增預減表達式;

相似地,

以下表達式是純右值表達式:

  1. function 調用或重載的運算符表達式,其返回類型為非引用
  1. a++a-- ,內置的后增量后減表達式
  1. a + ba % ba & ba << b和所有其他內置算術表達式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM