【发布时间】:2012-12-06 07:20:55
【问题描述】:
使用以 std::initializer_list 作为参数的函数,如下所示
int sumOf(std::initializer_list<int> numbers) {
int sum = 0;
for (auto x : numbers) {
sum += x;
}
return sum;
}
此代码有效
auto sum = sumOf({ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
但不是这个
int i[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
auto x = sumOf(i);
为什么第二种形式不起作用?还是我做错了什么?
编辑:
从 std::intializer_list 的 gcc 4.7.2 实现来看, intializer_list 的构造函数是私有的,编译器需要传递数组的大小。
// The compiler can call a private constructor.
constexpr initializer_list(const_iterator __a, size_type __l)
: _M_array(__a), _M_len(__l) { }
我猜编译器在某些情况下无法从变量“i”判断数组的大小。如果是这样,编译器不支持将静态数组传递给 intializer_list (?)。
【问题讨论】:
-
但是
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }确实创建了std::initializer_list。 -
好吧,一个传递一个初始化列表,除了函数之外,另一个传递一个数组,还有什么应该发生的。初始化列表不仅仅是一个数组。将其更改为
auto i = { ... };怎么样,但不确定这是否有效。 -
@ChristianRau - 它适用于
auto i = { ... };,但 "i" 似乎不再表现为 int 数组。 -
@KiranMohan 不,因为现在是
std::initializer_list,这是函数所期望的类型,与数组完全不同。
标签: c++ c++11 initializer-list