【发布时间】:2020-09-24 06:49:50
【问题描述】:
我想编写一个在编译时评估的函数,它需要一个指向 4 字节数组的指针,并输出一个与该数组具有相同位模式的 int。 所以我想出了:
constexpr int f(const char* p) {
return *reinterpret_cast<int*>(p);
}
然后,我想像这样使用f():
switch(x) {
case f("GOOG"):
// do something
case f("MSFT"):
// do something
case f("NIKE"):
// do something
}
但是,我遇到了编译器错误:
错误:通过常量表达式 case f("GOOG") 中的“int”glvalue 访问“GOOG”的值- 如何修复
f()使其编译? - 是否有更好的方法来实现相同的目标?
【问题讨论】:
-
即使编译了,也是严格的别名违规和UB。使用位移从单个
chars 中生成整数。 -
@HolyBlackCat 谢谢。顺便说一句,什么是 UB?
-
UB 是未定义的行为。
-
谢谢。我觉得进行 4 次位移并不像将其视为 int 那样优雅。有没有办法安全地做到这一点?
-
你也可以在其中创建一个
int和memcpy数组,但是memcpy不是constexpr。
标签: c++ compiler-errors bit-manipulation c++17 constexpr