3 回答
TA贡献1811条经验 获得超6个赞
至少在我阅读§7.1.5/ 3和§5.19时,以下内容可能是合法的:
unsigned constexpr const_hash(char const *input) {
return *input ?
static_cast<unsigned int>(*input) + 33 * const_hash(input + 1) :
5381;
}
这似乎遵循§7.1.5/ 3中的基本规则:
形式是:“回归表达”;
它唯一的参数是一个指针,它是一个标量类型,因此是一个文字类型。
它的返回是unsigned int,它也是标量(因此是字面的)。
没有隐式转换为返回类型。
有一些问题是*inputs 是否涉及非法左值转换,我不确定我是否理解§5.19/ 2/6/2 1和§4.1中的规则以确保这一点。
从实际的角度来看,这个代码被(例如)g ++接受,至少可以追溯到g ++ 4.7.1。
用法如下:
switch(std::hash(value)) {
case const_hash("one"): one(); break;
case const_hash("two"): two(); break;
// ...
default: other(); break;
}
为了符合§5.19/ 2/6/2的要求,您可能需要执行以下操作:
// one of the `constexpr`s is probably redundant, but I haven't figure out which.
char constexpr * constexpr v_one = "one";
// ....
case const_hash(v_one): one(); break;
我正在使用额外的'斜线'数字来指代未编号的子弹点,所以如果是第5.19 / 2节中的第六个要点,这是内部的第二个要点。我想我可能要和Pete Becker讨论是否可以在层次结构中添加某种数字/字母/罗马数字来识别这样的部分......
- 3 回答
- 0 关注
- 481 浏览
添加回答
举报