亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

返回類型'?:'(三元條件運算符)

返回類型'?:'(三元條件運算符)

C++
一只斗牛犬 2019-08-12 16:13:04
返回類型'?:'(三元條件運算符)為什么第一個返回引用?int x = 1;int y = 2;(x > y ? x : y) = 100;而第二個不?int x = 1;long y = 2;(x > y ? x : y) = 100;實際上,第二個根本沒有編譯 - “沒有左邊的賦值”。
查看完整描述

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必須是可修改的左值)


查看完整回答
反對 回復 2019-08-12
?
墨色風雨

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) 。如果重載決策失敗,則程序格式錯誤。否則,應用如此確定的轉換,并使用轉換的操作數代替本節其余部分的原始操作數。


查看完整回答
反對 回復 2019-08-12
  • 3 回答
  • 0 關注
  • 785 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號