【问题标题】:Vector of (Structs having vector)(具有向量的结构)的向量
【发布时间】:2019-11-15 09:46:56
【问题描述】:

Bjarne Stroustroup 的 C++ 中所述的以下代码:编程和原理

struct Day {
    vector <double> hour { vector <double> (24,-7777)}
};
struct Month {
    vector <Day> day {32};
};

这段代码初始化32天,每一天都是vector的24小时,用-7777初始化;

问题是为什么列表初始化程序 {32} 创建 32 天。 不应该用 32 作为初始值来初始化 day vector,而不是创建 32 个成员吗?

【问题讨论】:

  • 32 如何成为(单数)Day 对象的合适初始值?
  • vector&lt;Day&gt; day{32} 类似于 vector&lt;Day&gt; day(32)。如果你看向量定义,它说参数是向量的元素计数
  • @BAdhi 确定吗?只有包含在 (n) 中的参数创建 n 个项目的向量...而 {n} 初始化一个可能的向量

标签: c++ c++11 vector struct initialization


【解决方案1】:

对于list initialiation

否则,T 的构造函数将分两个阶段考虑:

所有以std::initializer_list为唯一参数的构造函数, 或者如果其余参数具有默认值,则作为第一个参数 值,被检查,并通过重载决议与 std::initializer_list 类型的单个参数

如果上一阶段没有产生匹配,T的所有构造函数 参与针对一组参数的重载决议 由支撑初始化列表的元素组成,具有限制 只允许非缩小转换。如果这个阶段 生成一个显式构造函数作为 a 的最佳匹配 复制列表初始化,编译失败(注意,简单 复制初始化,根本不考虑显式构造函数)。

dayvector &lt;Day&gt; 类型,其constructor taking std::initializer_list 作为参数需要std::initializer_list&lt;Day&gt;,它不能从支撑初始化器{32} 构造。然后使用 constructor taking size_type 并使用 32 个默认插入的 Day 实例构造 vector

另一方面,如果 Day 可以从 int 初始化,例如有一个构造函数采用int,然后std::initializer_list&lt;Day&gt; 可以从{32} 构造,因为从intDay 的隐式转换,然后vector &lt;Day&gt; day {32}; 将构造vector,其中一个元素从@987654346 初始化@。

LIVE

【讨论】:

    【解决方案2】:

    一个参数初始化器列表与向量constructor 匹配,采用一个参数,它分配了那么多元素。在本例中为 32。

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多