我有一个struct
持有一个数组,我想传递一个初始化列表到结构的构造函数被转发到数组。为了说明这一点,我想:用初始值设定项列表初始化成员数组的正确方法是什么?
#include <initializer_list>
struct Vector
{
float v[3];
Vector(std::initializer_list<float> values) : v{values} {}
};
int main()
{
Vector v = {1, 2, 3};
}
error: cannot convert ‘std::initializer_list<float>’ to ‘float’ in initialization
I tried using parentheses instead of braces为v
但给了错误:
error: incompatible types in assignment of ‘std::initializer_list<float>’ to ‘float [3]’
我对试图做到这一点的主要动机是为了避免下面警告叮当:
template <int N>
struct Vector
{
float v[N];
};
template <>
struct Vector<2>
{
float x, y;
};
int main()
{
Vector<2> v2 = {1.0f, 2.0f}; // Yay, works
Vector<3> v3 = {1.0f, 2.0f, 3.0f}; // Results in warning in clang++
Vector<3> u3 = {{1.0f, 2.0f, 3.0f}}; // Must use two braces to avoid warning
// If I could make Vector<N> take an initializer list in its constructor, I
// could forward that on to the member array and avoid using the double braces
}
warning: suggest braces around initialization of subobject
所以我的问题是:我怎样才能初始化一个成员数组与初始化列表? (即我怎样才能使第一个代码工作?或者是不可能的?
对于一个聚合,你甚至不需要ctor。请注意'initializer_list'的大小是可变的。 initializer-list初始化和_list-initialization_(这是一种语言结构,并可能导致使用初始化器列表调用ctor)之间也有区别。 – dyp 2013-05-02 14:54:29
你真的不能这样做,但是你可以使用'std :: array'吗? – juanchopanza 2013-05-02 14:54:52
他可以使用std :: array,但是我把它看作是关于语言的问题,而不是标准库。而且,在适当尊重任何人的情况下,告诉某人去读标准图书馆就像告诉幼儿通过阅读莎士比亚来学习英语一样。所以std :: array不是一个很好的答案。 – 2016-03-02 00:32:35