数组初始化列表中的隐式转换

Her*_*rtz 3 c++ initializer-list c++11

为什么从隐转换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" };
}
Run Code Online (Sandbox Code Playgroud)

变式2:

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

int main() {
   // could not convert from "const char*" to "Foo"
   Foo* foo = new Foo[1] { "a" };
}
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 6

用户定义的转换序列(12.3p4)中最多允许一个用户定义的转换.

您可以使用额外级别的大括号​​来使其工作:

   Foo* foo = new Foo[1] { {"a"} };
Run Code Online (Sandbox Code Playgroud)

请注意,由于clang的错误,它需要Foo具有默认构造函数,Foo::Foo()即使它实际上不会被调用.