c++ - 使用 std::initializer_list 参数将原始数组传递给函数

标签 c++ c++11 initializer-list

使用以 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_listinitializer_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/

相关文章:

java - 如何避免在 Java 和 native C++ 代码之间复制数据

c++ - 尝试渲染 3d 三角形会破坏 Nvidia 驱动程序!为什么? [C++ && DirectX11 SDK]

c++ - 是否可以在元组元素上应用通用函数?

c++ - 使用转换运算符初始化 map

c++ - 当在 std::list<shared_ptr> 的 C++14 初始化列表中间抛出时,GCC(但不是 Clang)下的内存泄漏

c++ - Xcode 4.3 在/usr/include 中找不到头文件

c++ - 如何在C++中拆分程序

c++ - 带有成员函数指针的模板元编程?

linux - TCP sendto (C++) 在 Linux 但不是 OSX 上失败。错误号 : EINVAL 22 Invalid argument

c++ - 初始化列表的使用