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

时间:2013-04-12 10:20:01

标签: c++ c++11 initializer-list

为什么从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" };
}

1 个答案:

答案 0 :(得分:6)

在用户定义的转换序列(12.3p4)中,最多允许一次用户定义的转换。

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

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

请注意,由于a bug in clang,它需要Foo才能拥有默认构造函数Foo::Foo(),即使它实际上不会被调用。