繁体   English   中英

在结构初始化中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM