b ? T1 : T2

條件運算符的結果類型是 T1 和 T2 的 common_type(可以使用 std::common_type )。對於基本算術類型(例如題主這裡的 int 和 double),它的結果的類型和 T1()+T2() 的結果的類型一樣,int+double-&>double,problem solved。

務必參考:

http://en.cppreference.com/w/cpp/types/common_type
?:三目運算符的返回類型必須是編譯期確定的。


因為conditional operator ? 本質上是一個函數,它的return type只能有一個。你這個例子中1.0和1的類型不一樣,編譯器只能把1轉換成更廣的double,然後調用return type為double的conditional operator。

IDE的type deduction經常不準確,具體還是得以編譯器為準。
因為計算機是不知道「1」 「1.0」 是什麼東西的,而貌似三目運算符的返回類型必須是一樣的,所以編譯器做了類似於隱式類型轉換的工作。
a是因為,?:運算符會像其他運算符如+-*/一樣會提升類型,因為一個是double,一個是int,最後會把int提升成double,返回值是一個double,所以自動推斷為double。
auto只是做了一個類型推斷,a的表示式在編譯器看起來,值可能是int也可能是double,那當然取double了。


推薦閱讀:
相关文章