使用以 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 的构造函数是私有(private)的,编译器需要传递数组的大小。
// 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(?)。
最佳答案
i
不是 initializer_list
。 initializer_list
不是“静态数组”的缩写。它是一个特殊对象,只能通过使用花括号初始化列表(即:{...}
语法)创建(在复制构造之外)。
当您执行 int i[] = {...};
时,您正在对一个数组 执行聚合初始化。 i
是一个 int
数组,而不是一个 initializer_list
。
你想要的是一个模板函数,它可以接受任何你可以使用 range-based-for over 的东西:
template<typename Rng>
int sumOf(const Rng &numberRange) {
int sum = 0;
for (auto x : numberRange) {
sum += x;
}
return sum;
}
关于c++ - 使用 std::initializer_list 参数将原始数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13738753/