当我将 int 和字符串的一对(复合)值传递给需要字符串向量的函数时,这就是我所期望的。
嗯,有你的问题。
{...}
不是“复合值”。它不是一个列表。它说,“使用这些值初始化一个对象”。如果有问题的对象是一个聚合,它将使用聚合初始化。如果所讨论的对象是非聚合类型,它将根据类型的匹配构造函数和 C++11 中花括号初始化列表的各种规则来选择要调用的构造函数。
您不应该将其{10, "foo"}
视为两个值的列表。它是一个包含两个值的初始化程序。它可以与 a 一起使用std::pair<int, const char *>
,依此类推。
的构造函数不显式的原因std::vector
正是为了允许这种构造。单参数构造函数是显式的,否则,隐式转换规则将允许这样做:
std::vector<T> v = 5; //???
或者,更重要的是:
void Foo(const std::vector<T> &v);
Foo(5); //???
我们不希望整数可以隐式转换为std::vector
s。但是,当您使用初始化程序时,允许更广泛的“隐式”转换更合理,因为您可以在{}
那里看到语法。
对于单参数情况,不清楚用户的意思。使用 {} 语法,用户的意思很清楚:初始化对象。
Foo({10, "foo"}); //Initializes the first argument given the values.