在 C++11 中,花括号{}
用于统一初始化。任何可以初始化的对象都可以用花括号进行初始化。优先考虑采用 的构造函数initializer_list<T>
,因此如果花括号初始化可以匹配多个构造函数并且其中一个采用initializer_list
,则将被选中。但是,如果没有initializer_list
构造函数匹配,则还会考虑其他构造函数。
例如:
vector<int> two_elems{5,10}; // A vector containing two elements
vector<int> five_elems(5,10); // A vector containing five elements
vector<int> five_elems_also{10,10,10,10,10}; // Equivalent to the above
在您的示例中,您正在使用a 初始化string
a char const[13]
。initializer_list<char const*>
如果有这样的构造函数,这将匹配,string
但它不匹配initializer_list<char>
。因此,参数改为与其他构造函数匹配,构造函数采用char const*
是最佳匹配。
请注意,由于存在歧义,除非您打算使用构造函数,否则最好不要使用大括号初始化来初始化容器(例如vector
、set
、list
或什至 )。例如,无法调用使用大括号初始化的构造函数,因为该参数列表也将匹配构造函数。再举一个例子:string
initializer_list
vector<size_t>
size_t, T
initializer_list
vector<char const*> vec_of_strs{ 5, 0 }; // Creates a vector holding *5* nullptrs
vector<unsigned> vec_of_nums{ 5, 0 }; // Creates a vector holding *2* numbers
上面两行调用非常不同的构造函数并不是很明显,如果在维护期间将其中一个的类型更改为另一个(或代码出现在模板中),程序员可能会对突然的行为变化感到非常惊讶。