GNU C 擴充套件裡對Elvis運算子的支援是怎麼樣的?

時間 2021-06-06 21:39:22

1樓:暮無井見鈴

關於問題 1 :

題主的理解基本是正確的,不過整個表示式的型別是 E1 與 E2 的共用型別。

它對應的標準寫法更像(以 clang 版本為例,暫未檢查 noexcept 與 SFINAE 性質)

// E1 ?: E2 --> elvis_opr(E1, E2);

template

class

U>constexpr

auto

elvis_opr(T

&&t,U

&&u)E1 就像函式引數一樣只求值一次,但轉換可能會進行兩次。

其中三元 ?: 的第一運算元是按語境 bool 轉換,後兩個運算元是轉換到共用型別,所以不能做到只轉換一次。

關於問題 2 :

這個擴充套件在 gcc 與 clang 中表現有別,原因不明。

在 E1 ?: E2 中,如果 E1 是類型別右值,則 gcc 拒絕編譯。但 clang 通過編譯,並可能 forward 兩次。

如果 E1 有標量型別,則無論左值還是右值均為 gcc 所接受。

參考:https://

wandbox.org/permlink/FE

LBqqZD2PfDRKOj

2樓:機犬

首先需要在常量/右值情況下使用的方法不加 const 都是耍流氓,其次 (S{} ? S{} : 1) 能用就好,不要依賴編譯器擴充套件,非標準的表示式支援起來肯定不會太積極。

python的邏輯運算子 and,or,not 和普通的邏輯運算子( )有何區別?

追遠 J 先糾正題主的乙個小錯誤。跟 同屬一家的運算子應該是 而非 這個問題還挺有意思 對問題本身的回答其實並不複雜 原則上講,and,or,not針對布林值 True False 進行運算,就是字面上的與或非的功能,確實可以稱之為邏輯運算子 類似C C 中的 而 則對應C C 中所謂的 按位運算子...

Java中如何對變數使用與或運算子。?

快樂領讀 1 與運算子 與運算子用符號 表示,其使用規律如下 兩個運算元中位都為1,結果才為1,否則結果為0,例如下面的程式段。public class data13 執行結果 a 和b 與的結果是 128 下面分析這個程式 a 的值是129,轉換成二進位制就是10000001,而 b 的值是128...

python如何實現左側的運算子過載?

Kittyhawk 先從myob 1說起,假設myob屬於Myob類,這裡我們過載了 mul class Myob def mul self val print mul 過載了 mul 後我們就可以順利實現myob 1,結果是列印出 mul 但如果把兩者換一下位,1 myob,就會報錯了。這是因為1...