为什么constexpr不会在索引越界时导致编译失败



我在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

这是一个演示。


注意,在c++20中,您可以使函数consteval,然后在所有情况下编译都将失败,因为函数必须在编译时求值

这是一个演示。

最新更新