2013-04-12 57 views
3

爲什麼從const char*std::string的隱式轉換在後一種情況下不起作用? 請儘可能鏈接參考C++標準。數組初始值設定項列表中的隱式轉換

變型1:

struct Foo { 
    Foo(const char* a) {} 
}; 

int main() { 
    // works well for a "const char*" accepting constructor 
    Foo* foo = new Foo[1] { "a" }; 
} 

變體2:

struct Foo { 
    Foo(std::string a) {} 
}; 

int main() { 
    // could not convert from "const char*" to "Foo" 
    Foo* foo = new Foo[1] { "a" }; 
} 
+0

有沒有這樣的事情作爲隱式演員。有一個cast(顯式類型轉換)和type coalescing(隱式類型轉換),決定哪一個。 – 2013-04-12 10:21:02

+0

檢查如何命名的頁面: http://en.cppreference.com/w/cpp/language/implicit_cast – Hertz

回答

6

至多一個用戶定義的轉換是允許在一個用戶定義的轉換序列(12.3p4)。

可以使用大括號的額外的水平,使其工作:

Foo* foo = new Foo[1] { {"a"} }; 

注意,因爲a bug in clang它需要Foo有一個默認的構造函數Foo::Foo()即使它實際上不會被調用。

+0

嗯...看起來不錯,用g ++很好,但不能用鏗鏘聲([LWS示例](http: //liveworkspace.org/code/4jHHSh$0)) – soon

+0

所以誰錯了? g ++或clang? – balki

+1

@balki鐺壞了;有一個簡單的解決方法(添加一個默認的構造函數)。現在報告錯誤。 – ecatmur

相關問題