问题描述
我目前正在尝试理解 C++11 中的列表初始化,我偶然发现了这行代码:std::vector<std::string> vec{3};
我想知道它实际上在做什么,我注意到在向量中创建了 3 个元素,我不确定这些元素将被初始化的原因和值。
编辑: 我试过跑步:
int main()
{
std::vector<std::string> vec{3};
std::cout<<vec.size()<<std::endl;
std::cout<<vec[0]<<std::endl;
std::cout<<vec[1]<<std::endl;
std::cout<<vec[2]<<std::endl;
}
而我只得到输出:
3
解决方法
vector<T>
有一个构造函数,它接受一个整数;它创建了一个包含 3 个默认初始化的 T
的向量。因此,当您使用等效于 vector<T>{3}
的语法时,此构造函数是可行的候选构造函数。
但是,使用 {}
语法意味着首先检查任何采用 vector<T>
的 initalizer_list
构造函数。如果 T
中的 vector<T>
是整数类型,{3}
将映射到 vector<T>
的 initializer_list<T>
构造函数。
但是由于在这种情况下 T
是一个 std::string
,vector<std::string>
的 initializer_list
构造函数不匹配整数。因此,而是调用了 N 元素构造函数。
为避免将来发生此类情况,您应避免将 {}
与容器和类容器类型一起使用,除非您打算使用一系列元素对其进行初始化。
如果它们是默认初始化的,输出不应该是:
没有。默认初始化的 std::string
不包含任何字符。不是“0”字符,没有字符。如果你打印出一个不包含任何字符的字符串,那么你什么也没有打印出来。
当您在 C++ 中初始化字符串向量时,它们将默认为空字符串,或 ""
。如果您尝试打印
std::cout << "";
你什么也得不到。这基本上就是这里发生的事情。每个索引只是一个打印空字符串的空字符串。