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

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++编译时,我得到了以下警告:

警告:仅支持-c++0x或-gnu++0x标准的扩展初始化列表 [默认情况下启用]

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

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


1
我觉得这似乎是一个bug,但我不确定... - Billy ONeal
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;
}

1
不仅仅是POD,任何聚合体都可以。这种空默认值看起来像是全局变量或静态变量的理想候选者 :-) - Kerrek SB
1
嗯,好吧。有点烦人,但我想我能忍受它。 - someguy
我在使用-std=c++98将结构体添加到映射中时遇到了相同的错误,但它仍然可以编译和正确运行。我意识到这是一个旧线程,但为了让任何可能阅读此内容的人受益,它可能只是一个误报警告。我想知道的是如何消除警告而不使用pragma或添加额外的代码行。 - orodbhen

11

聚合类型的花括号初始化只在声明初始化期间有效:

Foo a = { 1, 2, 3 };

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

C++11引入了统一的初始化语法,你可以编写f(Foo{1,2,3});


@Kenji:Mark B的回答已经足够清晰和完整。由于他先回答了,我已经接受了他的答案。 - someguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接