3 回答

TA貢獻1815條經驗 獲得超13個贊
表達式沒有返回類型,它們具有類型,并且 - 在最新的C ++標準中已知 - 值類別。
條件表達式可以是左值或右值。這是它的價值類別。(這有點簡化,C++11
我們有lvalues,xvalues和prvalues。)
在非常寬泛和簡單的術語中,左值是指內存中的對象,而右值只是一個值,可能不一定附加到內存中的對象。
賦值表達式為對象賦值,因此賦值的對象必須是左值。
對于條件表達式(?:
)是一個左值(再次,在廣泛的和簡單的術語),所述第二和第三操作數必須是左值的相同類型的。這是因為條件表達式的類型和值類別是在編譯時確定的,并且必須是適當的,無論條件是否為真。如果必須將其中一個操作數轉換為不同的類型以匹配另一個操作數,則條件表達式不能是左值,因為此轉換的結果不是左值。
ISO / IEC 14882:2011參考:
3.10 [basic.lval]左值和右值(關于值類別)
5.15 [expr.cond]條件運算符(條件表達式具有的類型和值類別的規則)
5.17 [expr.ass]賦值和復合賦值運算符(要求賦值的lhs必須是可修改的左值)

TA貢獻1853條經驗 獲得超6個贊
它不能返回左值,因為它必須隱式地提升x
匹配類型的類型y
(因為兩邊的:
類型不同),并且必須創建一個臨時值。
標準說什么?(n1905)
表達式5.17賦值和復合賦值運算符
5.17 / 3
如果第二個和第三個操作數具有不同的類型,并且具有(可能是cv-qualified)類類型,則嘗試將每個操作數轉換為另一個操作數的類型。確定T1類型的操作數表達式E1是否可以轉換為匹配類型T2的操作數表達式E2的過程定義如下:
- 如果E2是左值:如果E1可以隱式轉換(第4節)到類型“引用到T2”,則E1可以轉換為匹配E2,但受轉換引用必須直接綁定的約束(8.5.3)到E1。
- 如果E2是右值,或者上述轉換無法完成:
- 如果E1和E2具有類類型,并且底層類類型相同或者一個是另一個類的基類:如果T2的類與類型相同,則可以轉換為E1以匹配E2,或者基類類,T1的等級和T2的cv資格是與cv資格相同的cv資格,或者更高的cv資格。如果應用轉換,則將E1更改為類型T2的右值,該值仍然引用原始源類對象(或其相應的子對象)。[ 注意:即沒有復制。- 結束注釋 ]通過從E1復制初始化T2類型的臨時值并將該臨時值用作轉換后的操作數。
否則(即,如果
E1
或E2具有非類型類型,或者它們都具有類類型但基礎類不是相同的或者是另一個類的基類):如果E1可以是E1,則可以轉換為匹配E2如果E2被轉換為rvalue(或者它具有的類型,如果E2是rvalue),則隱式轉換為表達式E2將具有的類型。使用該過程,確定是否可以轉換第二操作數以匹配第三操作數,以及是否可以轉換第三操作數以匹配第二操作數。如果兩者都可以轉換,或者一個可以轉換,但轉換不明確,則程序格式不正確。如果兩者都不能被轉換,則操作數保持不變并且如下所述執行進一步檢查。如果只能進行一次轉換,則將該轉換應用于所選操作數,并使用轉換后的操作數代替本節其余部分的原始操作數。
5.17 / 4
如果第二個和第三個操作數是左值并且具有相同的類型,則結果是該類型并且是左值,如果第二個或第三個操作數是位字段,或者兩者都是位,則它是位字段領域。
5.17 / 5
否則,結果是右值。如果第二個和第三個操作數不具有相同的類型,并且具有(可能是cv限定的)類類型,則使用重載決策來確定要應用于操作數的轉換(如果有)(13.3.1.2,13.6) 。如果重載決策失敗,則程序格式錯誤。否則,應用如此確定的轉換,并使用轉換的操作數代替本節其余部分的原始操作數。
- 3 回答
- 0 關注
- 785 瀏覽
添加回答
舉報