【问题标题】:Creating a vector with n elements in a struct在结构中创建具有 n 个元素的向量
【发布时间】:2021-12-22 23:55:21
【问题描述】:

如果我只写这段代码:

std::vector<int> vec(24, 3);

它将创建一个名为 vec 的向量,其中包含 24 个元素,所有元素都等于 3。 但如果我有一个结构:

struct Day
{
    std::vector<int> days(24, 3);
};

并尝试做完全相同的事情它不起作用,这是为什么?

【问题讨论】:

    标签: c++ struct constructor stdvector


    【解决方案1】:
    struct Day
    {
        std::vector<int> days(24, 3);
    };
    

    正如另一个答案中已经提到的,您不能使用() 调用构造函数,因为该语法会触发most vexing parse

    事实上,days 会被解释为一个成员函数 Day::days() 的声明,返回一个std::vector&lt;int&gt;,并接受两个参数。但是,这些参数的类型没有指定,所以你会得到一个编译时错误。

    有趣的是,您可能考虑使用带有花括号{}统一初始化语法调用构造函数:

    struct Day
    {
        std::vector<int> days{24, 3};  // Pay attention!
    };
    

    这段代码可以编译;但它会创建一个 错误 向量,而不是您所期望的。实际上,它创建了一个包含两个整数 24 和 3 的向量。这是因为此语法调用了带有初始化列表的 std::vector 构造函数,而不是 (element count, element value) 构造函数重载你是说。

    因此,一个有效的选择是使用更详细的语法:

    struct Day
    {
        std::vector<int> days = std::vector<int>(24, 3);
    };
    

    【讨论】:

      【解决方案2】:

      语法是:

      struct Day
      {
          vector<int> days = vector<int>(24, 3);
      };
      

      您不能在那里使用() 语法调用构造函数(以避免vexing parse)(但可以使用{}= /*...*/)。

      【讨论】:

      • 有点遗憾,在这种情况下我们不能使用= {...}; 语法。
      • @aschepler:语法= {..} 是有效的Demo。但{3, 3, 3, 3,.. 3} 似乎不如vector&lt;int&gt;(24, 3) 合适。
      • 好的,是的。我们可以使用大括号,如果大小是恒定的并且不是很大的话。但我们不想重写。
      • 最令人烦恼的解析与这个无关 - 没有解析 (24, 3) 作为函数参数列表。括号不是类中成员声明的允许的初始化语法。
      • @aschepler:已经进行了屏蔽以避免可能出现的令人烦恼的解析问题(即使这里没有)。
      猜你喜欢
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      相关资源
      最近更新 更多