【发布时间】:2013-05-02 14:48:38
【问题描述】:
我有一个包含数组的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 for v 但这给出了错误:
error: incompatible types in assignment of ‘std::initializer_list<float>’ to ‘float [3]’
我尝试这样做的主要动机是避免 clang 生成的以下警告:
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)。 -
你真的做不到,但你能用
std::array代替吗? -
他可以使用 std::array,但我将其视为关于语言的问题,而不是标准库。而且,不管是谁,告诉某人去阅读标准图书馆就像告诉一个蹒跚学步的孩子通过阅读莎士比亚来学习英语。所以 std::array 不是一个很好的答案。