C ++在结构定义中初始化向量

时间:2016-11-30 11:33:32

标签: c++ c++11 visual-c++ struct

我正在阅读编程原理和实践C ++,并且遇到了以下一段我认为没有得到很好解释的代码

struct Day {
    vector<double> hour{vector<double>(24,-777) };
};

这里发生了什么?当我需要一个具有默认值的特定长度的矢量时,我通常会使用这个初始化器:

vector<double> hour(24, -777);

但是,这种初始化方式在struct中不起作用,

struct Day {
    vector<double> hour(24, -777);
};

导致编译错误

Error (active)      expected a type specifier   HelloWorld  d:\Visual Studio 2015\HelloWorld\HelloWorld\HelloWorld.cpp  11  
Error (active)      expected a type specifier   HelloWorld  d:\Visual Studio 2015\HelloWorld\HelloWorld\HelloWorld.cpp  11  
Error   C2059   syntax error: 'constant'    HelloWorld  d:\visual studio 2015\helloworld\helloworld\helloworld.cpp  11  

寻找初始化者背后的解释。

我正在使用MS Visual Studio 2015

4 个答案:

答案 0 :(得分:3)

vector<double>(24,-777)

这会创建一个临时std::vector,其中包含24个值-777

然后使用移动构造函数使用临时构造hour向量。

答案 1 :(得分:0)

这在Visual Studio 2015中运行良好:http://rextester.com/WIS16088也许你在代码中做了其他错误的事情?

无论如何要解释这里发生了什么:

  1. 这里的咖喱括号的行为在N3922中得到澄清,在这种情况下,它将提取到一个braced-init-list,这里有一些很好的进一步阅读:What Is a Curly-Brace Enclosed List If Not an intializer_list?
  2. 这些花括号为成员hours提供default member initialization,由C ++ 11提供。这是hours将采用的值,除非它:
  3.   

    也出现在构造函数的成员初始化列表中

    1. 最后让我们来讨论花括号中使用的值hours brace-init-list,显然vector<int> http://en.cppreference.com/w/cpp/container/vector/vector定义为2 nd 构造函数:
    2.   

      使用值为值

      的元素的计数副本构造容器

      因此,如果默认初始化,hours被初始化为包含24 int的值-777。

答案 2 :(得分:0)

C ++ 11解除了对类内初始化的限制,并为集合引入了initializer_list构造函数,允许你写这个:

struct Day {
    std::vector<double> hours = { 1.0, 2.0, 3.0 };
};

但是对于你的情况(向量填充24个-777.0的值),你不需要initializer_list - 你仍然可以使用旧的构造函数,但遗憾的是你不能将它与auto结合使用(除非static constexpr {1}}文字成员)。您可能应该使用24u参数,该参数旨在转换为size_tdouble作为值的参数(为了便于阅读):

struct Day {
    std::vector<double> hours = std::vector<double>(24u, -777.);
};

使用auto初始化某个成员的示例:

struct Day {
    static constexpr auto default_hours_size = 24u;
    std::vector<double> hours = std::vector<double>(default_hours_size, -777.);
};

答案 3 :(得分:-1)

您的解决方案应该有效。如果它不起作用,请尝试这样做:

struct Day {
    vector<double> hour = vector<double>(24,7);
};