关于C++顺序容器一致初始化的问题
大家都知道C++11提供了一种非常方便的初始化操作,就是全部使用大括号代替以前初始化时使用的小括号,例如读取输入到vector中,可以这样写:
istream_iterator<int> in{cin}, eof; vector<int> vec{in, eof};
问题来了,顺序容器有个构造函数接受一个整数,这时会开辟初始化该整数大小的容量,并且对每个元素进行值初始化。代码如下:
vector<int> vec(n);
如果这个时候使用大括号的话,就会导致歧义,因为编译器不知道到底是因该把该值当成大小还是容器内第一个元素的值,见代码:
vector<int> vec{n}; // 这个n可以用于表示vec的大小为n,也可以作为只有一个元素的列表初始化
这时,编译器会选择第二种情况,也就是把{n}当成列表初始化。如果后续代码访问下标大于0的元素,则会越界。因此如果想对vector<int>这种容器进行设置大小的初始化,就不能用大括号(一致初始化),只能用小括号。