【问题标题】:Why is this considered an extended initializer list?为什么这被认为是扩展的初始化列表?
【发布时间】:2011-12-17 08:42:30
【问题描述】:
#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 [默认启用]

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

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

【问题讨论】:

  • 对我来说似乎是一个错误,虽然我并不积极......

标签: c++ initializer-list


【解决方案1】:

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

Foo a = { 1, 2, 3 };

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

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

【讨论】:

  • @Kenji:Mark B 的回答足够清晰和完整。正如他首先回答的那样,我已经接受了他的回答。
【解决方案2】:

在 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;
}

【讨论】:

  • 不只是 POD,任何聚合都可以。这样的 null-defaults 看起来像是全局变量或静态变量的理想候选者:-)
  • 嗯,好吧。有点烦人,但我想我可以忍受。
  • 我在添加结构以映射到 -std=c++98 时遇到相同的错误,但它仍然可以正确编译和运行。我意识到这是一个旧线程,但为了任何可能阅读此内容的人的利益,它可能只是一个误报警告。我想知道的是如何在不使用编译指示或添加额外代码行的情况下消除警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2014-02-22
  • 2013-09-07
  • 2013-05-21
相关资源
最近更新 更多