Инициализация constexpr - «недопустимая инициализация сущности constexpr непостоянным выражением» - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть два enum class типа: Type и SocketType.Следующий код не компилируется и завершается с сообщением, упомянутым в вопросе, в VC ++ 2017:

static constexpr std::map<Type,SocketType> PacketTypeMap =
    {
        {Type::JUSTJOINED,      SocketType::TCP},
        {Type::CHAT_MESSAGE,    SocketType::TCP},
        {Type::REQUEST_WORLD,   SocketType::TCP},
        {Type::DATA_WORLD,      SocketType::TCP},
        {Type::DATA_PLAYER,     SocketType::UDP},
        {Type::RESPAWN_PLAYER,  SocketType::TCP}
    };

Пробовал некоторые варианты, и ничего не работает, но я уверен, что просто упускаю что-то простоес синтаксисом.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

std::map несовместимо с constexpr.Существует экспериментальная (?) Библиотека с именем Frozen , которая обеспечивает constexpr -совместимую frozen::map (кроме frozen::unordered_map, frozen::string и других).

Однако,скорее всего, вы просто хотите выбрать более простое решение (например, оператор switch в функции constexpr).

0 голосов
/ 06 декабря 2018

Перенос ответа из раздела комментариев в раздел ответов.

Нет карт constexpr.Он использует динамическое распределение, что невозможно с constexpr.Избавьтесь от constexpr или используйте другой контейнер для карты типа компиляции.

...