Чаму гэта лічыцца пашыраны спіс инициализатора?

#include 

struct foo {
    int i;
    int j;
    int k;
};

int main() {
    std::vector v(1);
    v[0] = {0, 0, 0};
    return 0;
}

Пры складанні гэтага з дапамогай G ++, я атрымліваю наступнае папярэджанне:

<Р> папярэджанне: пашыраныя спісы инициализатора даступныя толькі з -std = C ++ 0x або -std = гну ++ 0x [па змаўчанні ўключана]

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

Ці з'яўляецца гэта памылка ці я нешта адсутнічае?

10
Падобна на тое, памылка для мяне, хоць я не ўпэўнены ...
дададзена аўтар Billy ONeal, крыніца

2 адказы

Падрыхтоўка да C ++ 11 (і, магчыма, C99) можна толькі ініцыялізаваць POD пры стварэнні, а не ў адвольных кропках падчас выканання, якая з'яўляецца тое, што вы спрабуеце тут (заданне са спісу инициализаторов).

Вы можаце зрабіць null_foo хоць:

int main()
{
    const foo null_foo = {0, 0, 0};
    std::vector v(1);
    v[0] = null_foo;
    return 0;
}
21
дададзена
Хм, добра. Крыху раздражняе, але я мяркую, што я магу жыць з гэтым.
дададзена аўтар someguy, крыніца
Не толькі POD, любы агрэгат выдатна. І такія нулявыя значэнні па змаўчанні выглядаюць ідэальнымі кандыдатамі для глобалов або статыкі :-)
дададзена аўтар Kerrek SB, крыніца
Я атрымліваю тую ж памылку, дадаўшы на структуру для супастаўлення з -std = C ++ 98, але ён усё яшчэ збірае і працуе правільна. Я разумею, што гэта стары паток, але для выгоды тых, хто можа чытаць гэта, можа быць проста прытворнададатныя папярэджаннем. Тое, што я хацеў бы ведаць, як убраў папярэджанне без выкарыстання Прагма або дадаваць дадатковыя кода.
дададзена аўтар orodbhen, крыніца

Клямар ініцыялізацыя для агрэгатаў сапраўдная толькі пры дэкларацыя ініцыялізацыя :

Foo a = { 1, 2, 3 };

Гэта <ет> не спосаб стварэння часовых паўдарогі: some_function (праўда, {1,2,3}, 'з') .

C ++ 11 дадае <ет> раўнамерная ініцыялізацыі , у якім вы сапраўды можаце напісаць е (Foo {1,2,3}); .

9
дададзена
@Kenji: Адказ ад Mark B ясна і досыць досыць. Як ён адказаў першы, я прыняў яго адказ.
дададзена аўтар someguy, крыніца
Правільны і кароткі адказ. Гэта павінна быць прынята адзін.
дададзена аўтар Kenji, крыніца