2013-04-12 55 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

相关问题