【问题标题】:What does std::vector<std::string> vec{3}; actually do?什么 std::vector<std::string> vec{3};实际上呢?
【发布时间】:2021-07-06 00:21:58
【问题描述】:

我目前正在尝试理解 C++11 中的列表初始化,我偶然发现了这行代码:std::vector&lt;std::string&gt; 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

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

【问题讨论】:

  • 每个元素都是默认构造的。也许this std::vector Constructor reference 可能有用?顺便说一句,您正在使用链接参考中的重载编号 4(除非您的编译器真的很旧并且使用 C++11 之前的版本,在这种情况下它的编号为 3)。
  • 它是否调用 (4) 而不是 initializer_list c'tor,因为没有任何匹配的签名(只有 (10) 需要两个参数)?
  • @Sekai 你正在构建一个字符串向量。您正在打印空字符串。为什么他们会是"0"
  • 3 的值不是字符串,因此不能用于初始化列表构造函数。与参数 3 匹配的唯一其他构造函数是重载列表中的第 4 号。
  • 而且一个空字符串和字符串"0"有很大的不同。

标签: c++ initialization stdvector stdstring list-initialization


【解决方案1】:

vector&lt;T&gt; 有一个构造函数,它接受一个整数;它创建一个包含 3 个默认初始化的Ts 的向量。因此,当您使用与 vector&lt;T&gt;{3} 等效的语法时,此构造函数是一个可行的候选构造函数。

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

但由于在这种情况下Tstd::stringvector&lt;std::string&gt;initializer_list 构造函数不匹配整数。因此,改为调用 N 元素构造函数。

为避免将来发生此类事情,您应避免将 {} 与容器和类似容器的类型一起使用,除非您的意图是使用一系列元素对其进行初始化。

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

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

【讨论】:

    【解决方案2】:

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

    std::cout << "";
    

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

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 2020-02-01
      • 2014-10-24
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      相关资源
      最近更新 更多