2015-06-20 69 views
1

請看看這段代碼:爲什麼float參數適合int函數參數?

#include <iostream> 
class A { 
    public: 
    int my; 
    A(int a=0) : my(a) { } 
}; 

int main() { 
    A x = 7; // 1 
    A y = 6.7; // 2 
    std::cout << x.my << " " << y.my << "\n"; 
} 

它實際上編譯儘管沒有A(double a);構造。 何時允許編譯器將一個參數類型轉換爲另一個參數以調用相應的構造函數?

+0

'當正好編譯器允許convert'每次[當隱式轉換是可能的,沒有更好的方法]。 – deviantfan

+0

[此參考資料](http://en.cppreference.com/w/cpp/language/implicit_cast)列出標準轉換。這裏特別感興趣的是浮點積分轉換。 – chris

+0

另外,查看構造之間的區別,'A x(7)'和賦值,'x = 7;' –

回答

3

cppreference有a list的標準轉換。您感興趣的是浮動 - 積分轉換部分,其也可以在N4140 4.9/1

浮點類型的prvalue發現可以被轉換爲任何整數類型的prvalue。小數部分被截斷,即小數部分被丟棄。

查找A(int)可用標準轉換調用,編譯器插入必要的步驟以使代碼生效。這是相同的規則,允許int x = 1.1編譯

如果這種行爲是不可取的,你可以禁止它的=delete

class A { 
    public: 
    //... 
    A(int a); 
    A(double) =delete; 
};  
+0

'= delete'的效果是什麼? –

+0

'A(int)'被調用是因爲它是原始代碼中最好的匹配。如果有'A(double)',它會調用它。 '= delete'表示你不希望這個函數被調用 –

相關問題