括号初始化列表

时间:2012-12-04 05:13:56

标签: c++ arrays

我正在尝试向函数传递一个Data*指针数组。

void f(int argc, Data** argv) {
    ...
}
// at this point, I have Data* x, Data* y initialized
f(2, {x, y});

有没有办法让这样的代码运行,数组定义在函数调用内部?现在,返回的错误是

closure3.cc:15:8: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default]
closure3.cc:15:16: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘Data**’ for argument ‘2’ to ‘void f(int, Data**)’

有没有办法让数组实例化内联,是否可以在没有C ++ 0x的情况下执行此操作?提前致谢。

3 个答案:

答案 0 :(得分:4)

您可能需要考虑使用可变长度参数,这样就不必在内联实例化列表。

http://www.cprogramming.com/tutorial/lesson17.html

答案 1 :(得分:0)

大括号初始值设定项仅在声明数组变量时可用。所以你不能这样做。

从技术上讲,你可以用一个函数来做(注意:这是未经测试的)

Data ** pair_of_data(Data * x, Data * y)
{
  Data ** result = new Data*[2];
  result[0] = x;
  result[1] = y;
  return result;
}

但由于以下几个原因,这很难看:

  1. 数组最终在堆上,这实际上是不必要的
  2. 每次使用此功能时,都会要求(轻微)内存泄漏。
  3. 需要重载到模拟varargs,或者更改为使用varargs,从而失去类型安全性。
  4. 如果您特别需要传递对,请考虑使用std::pair。这些可以使用std::make_pair内联创建。<​​/ p>

    但最后,使用STL容器或在调用函数之前声明数组变量可能更容易,因此您可以使用聚合初始化。或者添加-std=c++0x标志。

答案 2 :(得分:-1)

如果你真的想要它没有C ++ 11的功能,你可能会尝试这样做(不是很好的代码,只是为了表明这个想法):

vector<int> InitList(int first, ...)
{
    vector<int> arr;
    int *p = &first;

    while(*(p + 1))
    {
        arr.push_back(*p);
        p++;
    }

    return arr;
}

int main()
{
    F(2, InitList(1, 2, 3));
}