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

som*_*guy 11 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;
}
Run Code Online (Sandbox Code Playgroud)

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

警告:扩展初始化列表仅在-std = c ++ 0x或-std = gnu ++ 0x [默认启用]时可用

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

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

Mar*_*k B 22

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;
}
Run Code Online (Sandbox Code Playgroud)


Ker*_* SB 11

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

Foo a = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

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

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