【问题标题】:Brace enclosed initializer lists大括号括起来的初始化列表
【发布时间】:2012-11-21 16:49:28
【问题描述】:

我正在尝试将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 的情况下做到这一点?提前致谢。

【问题讨论】:

  • 您是否尝试过聆听那里的警告并将-std=c++0x 添加到您的编译行?
  • 强烈建议使用vector > & 代替Data** 或者如果你不能使用C++,将标签改为“C”。
  • ^ 这很可爱,但你知道内联的方法吗?还有@Cornstalks,我试过了。
  • 差不多是C99; f(2, (Data **){x, y}); 是复合文字。它不是 C++2011 AFAIK 的一部分。

标签: c++ arrays


【解决方案1】:

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

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

【讨论】:

  • 感谢您的提示!我最终使用了 C++0x 并开始工作。谢谢!
【解决方案2】:

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

从技术上讲,您可以使用函数来完成(注意:这是未经测试的)

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

但这很丑,有几个原因:

  1. 数组最终在堆上,这真的没必要
  2. 您每次使用该函数时都要求(轻微)内存泄漏。
  3. 需要将其重载以模拟可变参数,或更改为使用可变参数,从而失去类型安全性。

如果您特别需要传递对,请考虑改用std::pair。这些可以使用std::make_pair 内联创建。

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

【讨论】:

    【解决方案3】:

    如果你真的想要它没有 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));
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2016-04-14
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      相关资源
      最近更新 更多