[英]In struct initialization
关于C ++的某些事情使我感到困惑,我可以写一些类似的东西:
struct Test {
double V[3];
}
没问题,但是当我尝试例如:
struct Test {
vector<double> V(3);
}
编译器给我一个错误。 上面的有什么区别,我的意思是为什么第二个不能编译?
而且,这一点更加令人困惑:
struct Test {
std::vector<double> V[3];
}
至少在我看来应该抛出编译器错误的最后一个示例由GCC和Clang编译而没有问题。
不要混淆初始化和声明。
double V[3];
这声明了三个双精度数组。 没问题。 没有初始化。
vector<double> V(3);
这将声明一个向量,并尝试通过以3
作为参数调用其构造函数来对其进行初始化。 此处不允许这样的初始化。 在C ++ 11中,您可以使用带有花括号的初始化语法,这是允许的:
vector<double> V{3};
但是,由于vector具有一个采用initializer_list<double>
的构造initializer_list<double>
,因此将其解释为调用该构造函数,而不是采用size_t
值的构造函数(所需的一种)。 它将使用单个元素( 3.0
)初始化向量。 您可以使用V{0,0,0}
来实现所需的值,尽管一旦需要三个以上的值,这可能会很难看。
最后一个例子
std::vector<double> V[3];
只需声明三个向量的数组即可。 没有初始化。 没问题。
那是不同的东西。
第一个声明一个包含三个元素的数组。 [3]
是类型的一部分。
第二个声明一个向量,然后使用类似于初始化语法的内容,但是在此特定上下文中是不允许的。 (3)
不是该类型的一部分。 (请注意,在C ++ 11或14中,您将获得允许类似内容的类内初始化程序。)
第三个声明三个向量的数组。 将语法与第一个语法进行比较:所做的更改只是将double
替换为std::vector<double>
。
您要在这里做的是:
struct Test {
vector<double> v;
Test(): v(3) {}
};
这会向您的结构添加带有初始化列表的构造函数,该初始化列表以3
作为参数显式调用向量的构造函数。
否则,就不可能在声明结构或类成员的上下文中调用构造函数(除了带有花括号的具有特定C ++ 11语法的初始化程序列表构造函数)。
更一般而言,固定大小的数组应使用std::array
类,如前所述。
似乎您想要固定长度的数组stl类型。 std::vector
不是这个。 您正在寻找std::array
您可能需要std::array<double, 3>
。
如果这不是您的意图,请不要理会。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.