11
#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 类型。

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

4

2 回答 2

22

在 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;
}
于 2011-10-28T14:45:57.510 回答
11

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

Foo a = { 1, 2, 3 };

不是中途生成临时对象的方法:some_function(true, {1,2,3}, 'c').

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

于 2011-10-28T14:50:53.060 回答