std::vector<std::string> vec{3}; 是什么意思?实际上呢?

What does std::vector<std::string> vec{3}; actually do?

我目前正在尝试了解 C++11 中的列表初始化,我偶然发现了这行代码:std::vector<std::string> vec{3};我想知道它实际上在做什么,我注意到在vector 但是,我不确定这些元素将被初始化的原因和值是什么。

编辑: 我试过 运行:

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

如果它们是默认初始化的,输出不应该是:
3
0
0
0

vector<T> 有一个接受单个整数的构造函数;它创建一个包含 3 个默认初始化的 T 的向量。因此,当您使用等同于 vector<T>{3}.

的语法时,此构造函数是可行的候选构造函数

但是,使用 {} 语法意味着首先检查任何采用 initalizer_listvector<T> 构造函数。如果 vector<T> 中的 T 是整数类型,{3} 将映射到 vector<T>initializer_list<T> 构造函数。

但是由于 T 在这种情况下是 std::stringvector<std::string>initializer_list 构造函数不匹配整数。因此,改为调用 N 元素构造函数。

为避免将来出现此类情况,您应该避免将 {} 用于容器和类似容器的类型,除非您打算使用一系列元素来初始化它们。

If they are default initialized shouldn't the output be:

没有。默认初始化的 std::string 不包含任何字符。不是“0”字符,没有字符。如果你打印出一个不包含任何字符的字符串,那么你什么也没有打印出来。

当您在 C++ 中初始化字符串向量时,它们将默认为空字符串,或 ""。如果您尝试打印

std::cout << "";

你什么也得不到。这基本上就是这里发生的事情。每个索引只是一个打印空字符串的空字符串。