如何使用initializer_list初始化成员数组?
我正在快速使用C ++ 0x,并使用g ++ 4.6进行测试
我只是尝试了下面的代码,认为它会工作,但它不会编译。我收到错误:
incompatible types in assignment of ‘std::initializer_list<const int>’ to ‘const int [2]’
struct Foo
{
int const data[2];
Foo(std::initializer_list<int const>& ini)
: data(ini)
{}
};
Foo f = {1,3};
没有找到相关结果
已邀请:
7 个回复
闯舱酮
编辑:如果你可以没有const,但另一种方法是跳过初始化并填充函数体中的数组:
但是,这样会丢失前一个解决方案提供的编译时边界检查。
抚驰
如果你真的坚持
,你可以使用
将
的底层数组转换为C风格的数组。
钾涎净介
有点难看,与常见用法不一致
冕偷淮款
构造函数,则数组将被默认初始化。但有时你想保持底层阵列不受限制(可能出于性能原因)。您不能添加默认构造函数和variadic-templated。 变通方法是variadic-templated构造函数的附加参数,以区别于零参数构造函数:
所以,现在你可以使用大括号来初始化对象,或者将它保持为未初始化:
2016年7月31日更新 三年过去了很快,编译器实现者改进了他们产品的标准符合性,直到在存在可变参数构造函数的情况下默认构造函数不被认为是模糊的水平。因此,在实践中,我们不需要为变量构造函数添加额外的
参数来消除构造函数的歧义。 都
和
如果没有参数构造对象,则会使数组未初始化。这种行为在所有主要编译器上都是一致的。完整示例(rextester):
输出:
删除默认构造函数仍会导致调用可变参数构造函数并且数组被默认初始化(在我们的例子中使用全零)。 感谢@Alek提出这个问题,并提请注意这些事实,并感谢所有在编译器开发上努力工作的人。
粳饶瓢部
哩翔购
我发现这个简单的方法很好地工作:
当然,如果你有很多元素,可变参数模板方法可能会更好,但在这个简单的情况下,这可能就足够了。 也就是说,如果要从初始化列表中显式定义构造函数。对于大多数POD案例,这是好的和花花公子:
翰冒绢县