设置的静态constexpr

Fel*_*ara 1 c++ c++11

enum class PARAM_TYPE_ {INT_};
enum class PARAM_NAME_ {NAME_};
typedef std::pair<PARAM_NAME_,PARAM_TYPE_> PARAM_;

static constexpr std::unordered_set<PARAM_> params_ {
        PARAM_(PARAM_NAME_::NAME_,PARAM_TYPE_::STRING_)
};
Run Code Online (Sandbox Code Playgroud)

为什么不能把它放在我的类头文件中?

我试了很长时间才弄清楚为什么不可能使用以下组合:

static,constexpr,非文字类型

但是我的整体c ++知识太有限了.

Edg*_*jān 8

来自constexpr:

constexpr变量必须满足以下要求:

  • 它的类型必须是文字类型
  • 必须立即初始化
  • 其初始化的完整表达式,包括所有隐式转换,构造函数调用等,必须是一个常量表达式

现在,从文字类型我们可以得出结论,文字类型可能是一个聚合类型,一个至少有一个constexpr(可能是模板)构造函数的类型,它不是复制或移动构造函数,或者,因为C++ 17,一个闭包类型.

std::unordered_set我们看到没有constexpr构造函数.其他两种情况也不适用,因此您无法标记std::unordered_setconstexpr.

基本上,您使用std::unordered_set默认分配器,这意味着动态内存分配.动态内存分配是一个运行时的事情时,constexpr是一个完全编译时野兽.

  • 似乎错过了“unordered_set”和“unordered_map”的机会,因为它们的 constexpr 版本可以使用完美的散列并且不占用额外的空间。有关示例,请参阅 https://github.com/serge-sans-paille/frozen。 (5认同)