为什么这被认为是扩展的初始化列表?

时间:2011-10-28 14:42:18

标签: c++ initializer-list

#include <vector>

struct foo {
    int i;
    int j;
    int k;
};

int main() {
    std::vector<foo> v(1);
    v[0] = {0, 0, 0};
    return 0;
}

使用g ++编译时,我收到以下警告:

  

警告:扩展初始值设定项列表仅适用于-std = c ++ 0x或-std = gnu ++ 0x [默认启用]

据我所知,它只是一个普通的初始化列表。结构是POD类型。

这是一个错误还是我错过了什么?

2 个答案:

答案 0 :(得分:21)

Pre C ++ 11(可能还有C99)你只能在创建时初始化POD,而不是在任意运行时点,这是你在这里尝试的(从初始化列表中分配)。

你可以制作一个null_foo:

int main()
{
    const foo null_foo = {0, 0, 0};
    std::vector<foo> v(1);
    v[0] = null_foo;
    return 0;
}

答案 1 :(得分:9)

聚合的括号初始化仅在声明初始化期间有效:

Foo a = { 1, 2, 3 };

是一种在中途生成临时的方法: some_function(true, {1,2,3}, 'c')

C ++ 11添加统一初始化,您可以在其中编写f(Foo{1,2,3});