Почему это считается расширенным списком инициализаторов?

#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 = С++ 0x или -std = gnu ++ 0x [включено по умолчанию]

Насколько я могу судить, это просто обычный список инициализаторов. Структура представляет собой тип POD.

Является ли это ошибкой или я что-то не хватает?

Ответ 1

Pre С++ 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;
}

Ответ 2

Инициализация скобок для агрегатов действительна только во время инициализации объявления:

Foo a = { 1, 2, 3 };

Это не способ генерации временных рядов: some_function(true, {1,2,3}, 'c').

С++ 11 добавляет единую инициализацию, в которой вы действительно можете написать f(Foo{1,2,3});.