2015-05-09 83 views
4
class P { 
    public: 
explicit P(int a, int b, int c) { 
    std::cout<<"calling explicit constructor"<<"\n"; 
    } 

}; 


int main() { 

P z {77,5,42}; // OK 

P w = {77,5,42}; // ERROR due to explicit (no implicit type conversion allowed) 

} 

我認爲{77,5,42}具有隱式類型std::initialization_list<int>。如果是這種情況,不會導致建造變量z的失敗?使用std :: initializer_list顯式構造函數和初始化

回答

3

我認爲{77,5,42}std::initialization_list<int>

{77,5,42}本身沒有類型的隱式類型。如果您編寫auto x = {77, 5, 42},則x的類型爲initializer_list。您的示例類型P具有顯式構造函數。實際上,這意味着你必須寫:

P w = P{77, 5, 42} 

或者更好:

auto w = P{77, 5, 42} 

如果這是不是造成建築可變z的失敗的情況下?

建設不會失敗,因爲你明確地對其進行初始化:P x{a, b, c}不執行任何類型的隱式轉換,而是簡單地使用統一初始化語法調用的P的(明確的)構造函數。

+1

'{77,5,42}'沒有類型。 –

+0

謝謝,澄清。 – mavam

0

編譯器正試圖通過尋找一個構造函數,可以匹配

= {77,5,42}; 

部分做隱式轉換。

但是,它發現的構造函數被標記爲顯式,因此它不能用於隱式轉換。因此你會得到一個錯誤。

這可能會感興趣:What does the explicit keyword mean in C++?