为什么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)); } #包括 #包括 列举事物{ val1=0, val2, val3, 瓦尔4 }; constexpr const char*things_strings[4]={“A”、“B”、“C”、“D”}; constexpr const char*get\u thing\u字符串(const things){ 返回物品字符串[静态施法(物品)]; } int main(){ std::cout

为什么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)); } #包括 #包括 列举事物{ val1=0, val2, val3, 瓦尔4 }; constexpr const char*things_strings[4]={“A”、“B”、“C”、“D”}; constexpr const char*get\u thing\u字符串(const things){ 返回物品字符串[静态施法(物品)]; } int main(){ std::cout,c++,c++11,constexpr,C++,C++11,Constexpr,是,但您正在运行时调用该函数。如果您在编译时上下文中调用此函数,例如,通过分配给constepr变量,您将得到编译时错误: constexpr auto c = get_thing_string(static_cast<things>(12)); // error constexpr auto c=get_thing_string(static_cast(12));//错误 这是一个例子 请注意,在c++20中,您可以使函数consteval,然后在所有情况下编译都会失败,因

是,但您正在运行时调用该函数。如果您在编译时上下文中调用此函数,例如,通过分配给
constepr
变量,您将得到编译时错误:

constexpr auto c = get_thing_string(static_cast<things>(12));  // error
constexpr auto c=get_thing_string(static_cast(12));//错误
这是一个例子


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


这是一个.

将来,除了用特定的语言版本加标签,还用C++标记。这样,更多的用户可以回答这个问题。