初始化constexpr-“使用非常量表达式非法初始化'constexpr'实体”

时间:2018-11-30 18:24:13

标签: c++ initialization const constexpr stdmap

我有两种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 :(得分:1)

将答案从评论部分迁移到答案部分。

  

没有constexpr映射。它使用动态分配,而constexpr则无法实现。摆脱constexpr,或将其他容器用于编译类型映射。

答案 1 :(得分:1)

std::mapconstexpr不兼容。有一个名为frozen的实验性(?)库,它提供了constexpr兼容的frozen::mapfrozen::unordered_mapfrozen::string等除外)。

但是,很可能您只是想选择一个更简单的解决方案(例如constexpr函数中的switch语句)。