我在我的 C++ 项目中编写了一个小辅助函数,它应该将 enum
的值转换为预定的字符串列表。我是这样写的:
#include <stdint.h>
#include <iostream>
enum things{
val1 = 0,
val2,
val3,
val4
};
constexpr const char* things_strings[4] = {"A", "B", "C", "D"};
constexpr const char* get_thing_string(const things thing){
return things_strings[static_cast<uint32_t>(thing)];
}
int main(){
std::cout << get_thing_string(things::val1);
std::cout << get_thing_string(static_cast<things>(12));
}
我预计这会编译失败。我认为通过使用 constexpr 我可以防止编译时出现索引越界问题。有没有办法在 C++ 11 中强制执行此操作?
最佳答案
是的,但您是在运行时调用该函数。如果您在编译时上下文中调用此函数,例如通过分配给 constexpr
变量,您将收到编译时错误:
constexpr auto c = get_thing_string(static_cast<things>(12)); // error
这是一个demo .
请注意,在 c++20 中,您可以使用函数 consteval
,然后编译在所有情况下都会失败,因为函数必须在编译时求值。
这是一个demo .
关于c++ - 为什么 constexpr 不会因索引越界而导致编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63535233/