在某些情况下,初始化的真实含义依赖于传递初始值时用的是花括号还是圆括号,例如,用一个整数来初始化vector<int>时,整数的含义可能是vector对象的容量也可能是元素的值。类似的,用两个整数来初使化vector<int>时,这两个整数可能一个是vector对象的容量,另一个是元素的初值,也可能它们是容量为2的vector对象中两个元素的初值。通过使用花括号或圆括号可以区分上述这些含义:
vector<int>v1(10);//(圆括号) v1有10个元素,每个的值都是0
vector<int> v2{10};//(花括号)v2有1个元素,该元素的值时10
vector<int> v3(10,1);//(圆括号)有10个元素,每个的值都是1
vector<int> v4{10,1}; //(花括号)有两个元素,值分别是10,1
如果用圆括号,可以说提供的值是用来构造vector对象的。例如,v1的初始值说明了vector对象的容量;v3的两个初始值则分别说明了vector对象的容量和元素的初值。
如果用的是花括号,可以表述成我们想列表初始化该vector对象。也就是说,初始化过程会尽可能地把花括号内的值当成是元素初始值的列表来处理,只有在无法执行列表初始化时才会考虑其他初始化方式。在上例中,给v2和v4提供的初始值都作为元素的值,所以它们都会执行列表初始化,vector对象v2包含一个元素而vector对象v4包含两个元素。
另一方面,如果初始化时使用了花括号的形式但是提供的值又不能用来列表初始化,就要考虑用这样的值来构造vector对象了。例如,要想列表初始化一个含有string对象的vector对象,应该提供能赋给string对象的初值。此时不难区分到底是要列表初始化vector对象的元素还是用给定的容量值来构造vector对象:
vector<string> v5{"hi}; //列表初始化,v5有一个元素
vector<string> v6("hi");//错误,不能使用字符串字面值构造vector对象
vector<string> v7(10); //有10个默认初始化的元素
vector<string> v8{10,"hi"}; //因为10 不是字符类型,有10个值为”hi“的元素
文章内容抄于c++ primer 第三章