Инициализировать агрегат как член класса

В этом коде:

#include <array>
#include <cstdint>

struct K {
    std::array<char, 4> a;
    std::uint8_t b;
};

const K k1 = { {'T', 'e', 's', 't'}, 1 };

class X {
    const K k2 = { {'A', 'b', 'c', 'd'}, 2 };
};

Я могу нормально инициализировать глобальный объект k1. Но попытка использовать тот же синтаксис для инициализатора по умолчанию члена класса k2 приводит к ошибкам компилятора (аналогичные ошибки из g++-4.8.2 и g++-5.2.0):

main.cpp:12:44: error: array must be initialized with a brace-enclosed initializer
     const K k2 = { {'A', 'b', 'c', 'd'}, 2 };
                                            ^
main.cpp:12:44: error: too many initializers for 'std::array<char, 4ul>'

Как правильно инициализировать k2 при его объявлении?


person aschepler    schedule 21.12.2015    source источник
comment
Какой компилятор вы используете?   -  person Nicol Bolas    schedule 22.12.2015
comment
Clang принимает его с предупреждением main.cpp:9:17: warning: suggest braces around initialization of subobject [-Wmissing-braces] (для std::array инициализации).   -  person Jarod42    schedule 22.12.2015


Ответы (1)


Вам просто нужна дополнительная пара фигурных скобок:

class X {
    const K k2 = { {{'A', 'b', 'c', 'd'}}, 2 };
};
person 101010    schedule 21.12.2015
comment
Я нахожу забавным, что юниформ-инициализация не является такой вещью. - person Lightness Races in Orbit; 22.12.2015
comment
@LightnessRacesinOrbit Будет еще веселее, ждите C++17 :) - person 101010; 22.12.2015
comment
Является ли это стандартным требованием или g++ не принимает оригинал? - person M.M; 22.12.2015
comment
@ M.M Я думаю, что это было требованием до C ++ 14. Я не знаю, соответствует ли GCC этому вопросу или нет. - person 101010; 22.12.2015