我正在阅读编程原理和实践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
答案 0 :(得分:3)
vector<double>(24,-777)
这会创建一个临时std::vector
,其中包含24个值-777
。
然后使用移动构造函数使用临时构造hour
向量。
答案 1 :(得分:0)
这在Visual Studio 2015中运行良好:http://rextester.com/WIS16088也许你在代码中做了其他错误的事情?
无论如何要解释这里发生了什么:
hours
提供default member initialization,由C ++ 11提供。这是hours
将采用的值,除非它:也出现在构造函数的成员初始化列表中
hours
brace-init-list,显然vector<int>
http://en.cppreference.com/w/cpp/container/vector/vector定义为2 nd 构造函数:使用值为值
的元素的计数副本构造容器
因此,如果默认初始化,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_t
和double
作为值的参数(为了便于阅读):
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);
};