




Вы почти у цели. Прежде всего, тип char const[] должен быть указателем, потому что это неполный тип, который может не содержаться в std::pair. А во-вторых, вам не хватает пары фигурных скобок. Правильное объявление будет выглядеть так:
constexpr std::array<std::pair<int, const char*>, 3> strings = {{
{0, "Int"},
{1, "Float"},
{2, "Bool"},
}};
Дополнительные фигурные скобки необходимы, потому что std::array является агрегатом, содержащим необработанный массив C, и поэтому нам нужны фигурные скобки, упомянутые явно, чтобы {0, "Int"} не принималось ошибочно в качестве инициализатора для объекта внутреннего массива.
@aep - у алгоритма удаления фигурных скобок есть проблемы с пониманием того, что вы имеете в виду инициализировать первую пару, а не внутренний массив.
Думаю, немного поэкспериментировав, я теперь понимаю разницу. Немного повозился с несколькими комбинациями, такими как std::array<std::string, 2> s = {"hi", "hello"};, std::array<std::string, 2> s = {{"hi", "hello"}};, std::array<std::string, 2> s = {{"hi"}, {"hello"}};, std::array<std::string, 2> s = {{{"hi"}, {"hello"}}};, чтобы увидеть разницу. Спасибо за объяснение.
Почему упрощенная агрегатная инициализация в С++ 14 здесь не работает?
std::array<std::string,2> s = {"Hi","Hello"};иstd::array<std::string,2> s = {{"Hi, "Hello"}};считаются идентичными после C++14 (в случае массива, отличного от constexpr). Почему здесь не действует то же правило?