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 ++知识太有限了.
来自constexpr:
constexpr变量必须满足以下要求:
- 它的类型必须是文字类型
- 必须立即初始化
- 其初始化的完整表达式,包括所有隐式转换,构造函数调用等,必须是一个常量表达式
现在,从文字类型我们可以得出结论,文字类型可能是一个聚合类型,一个至少有一个constexpr(可能是模板)构造函数的类型,它不是复制或移动构造函数,或者,因为C++ 17,一个闭包类型.
从std::unordered_set我们看到没有constexpr构造函数.其他两种情况也不适用,因此您无法标记std::unordered_set为constexpr.
基本上,您使用std::unordered_set默认分配器,这意味着动态内存分配.动态内存分配是一个运行时的事情时,constexpr是一个完全编译时野兽.