C++11中std::vector<std::string> vec{3}的实际作用是什么?
C++11 std::vector列表初始化
{3}行为解析 行为触发原因
C++11的列表初始化对容器类有明确的重载匹配优先级:
- 优先匹配参数为
std::initializer_list<T>的构造函数,前提是初始化列表内的所有元素都可以隐式转换为容器的元素类型T - 匹配失败时,才会回退到普通参数的构造函数
你写的std::vector<std::string> vec{3}中,初始化列表的元素是int类型的3,无法隐式转换为std::string,因此不会匹配initializer_list<std::string>的构造函数,最终匹配到普通构造函数vector(size_type count),作用是创建count个值初始化的元素,所以你会观察到vector的大小为3。
元素初始值说明
vector(size_type count)构造函数对元素执行的是值初始化,对于std::string这种有默认构造函数的类类型,值初始化等价于调用默认构造函数,因此3个元素都是空的std::string对象。
你运行的代码中,vec[0]、vec[1]、vec[2]输出的都是空字符串,加上后续的换行,最终运行结果视觉上只有第一行的3,后续三行都是空白,所以你会觉得“仅输出了3”。
常见误解澄清
你提到的“默认初始化输出0、0、0”是混淆了两种场景:
- 如果是内置类型
int的vector,使用圆括号初始化std::vector<int> vec(3),才会匹配count构造函数,生成3个值为0的int元素 - 如果对
int的vector使用列表初始化std::vector<int> vec{3},因为int和初始化列表元素类型匹配,会优先调用initializer_list构造函数,得到大小为1、唯一元素为3的vector,而非3个元素
验证示例代码
int main() { // 匹配initializer_list,size为1,元素值为3 std::vector<int> v1{3}; std::cout << v1.size() << std::endl; // 输出1 std::cout << v1[0] << std::endl; // 输出3 // 匹配count构造函数,size为3,元素值都是0 std::vector<int> v2(3); std::cout << v2.size() << std::endl; // 输出3 std::cout << v2[0] << " " << v2[1] << " " << v2[2] << std::endl; // 输出0 0 0 // 回退到count构造函数,size为3,元素都是空串 std::vector<std::string> v3{3}; std::cout << v3.size() << std::endl; // 输出3 std::cout << (v3[0].empty() ? "空串" : v3[0]) << std::endl; // 输出空串 }
内容的提问来源于stack exchange,提问作者Enigma
相关产品推荐
相关产品推荐

