Инициализация constexpr std::array пар

Как в C++14 инициализировать глобальный constexpr std::array of std::pair, содержащий текстовые строки? Не работает следующее:

#include <array>

constexpr std::array<std::pair<int, const char[]>, 3> strings = {
  {0, "Int"},
  {1, "Float"},
  {2, "Bool"}};

int main() {
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
2 298
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы почти у цели. Прежде всего, тип 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"} не принималось ошибочно в качестве инициализатора для объекта внутреннего массива.

Почему упрощенная агрегатная инициализация в С++ 14 здесь не работает? std::array<std::string,2> s = {"Hi","Hello"}; и std::array<std::string,2> s = {{"Hi, "Hello"}}; считаются идентичными после C++14 (в случае массива, отличного от constexpr). Почему здесь не действует то же правило?

aep 11.03.2019 12:35

@aep - у алгоритма удаления фигурных скобок есть проблемы с пониманием того, что вы имеете в виду инициализировать первую пару, а не внутренний массив.

StoryTeller - Unslander Monica 11.03.2019 12:49

Думаю, немного поэкспериментировав, я теперь понимаю разницу. Немного повозился с несколькими комбинациями, такими как 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"}}};, чтобы увидеть разницу. Спасибо за объяснение.

aep 11.03.2019 13:02

Другие вопросы по теме