c++ - 为什么 constexpr 不会因索引越界而导致编译失败

标签 c++ c++11 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

这是一个demo .


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

这是一个demo .

关于c++ - 为什么 constexpr 不会因索引越界而导致编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63535233/

相关文章:

c++ - reinterpret_cast 右值和优化

c++ - 等同于 "typename",表示从属名称确实是 'template template parameter'

c++ - 如何返回没有复制构造函数的对象

c++14 static constexpr auto 与 odr 用法

return 语句中的 C++ constexpr 函数

c++ - const 可以,但不是 constexpr?

c++ - VirtualAlloc 的内存使用率高于预期;这是怎么回事?

c++ - 带有 std::execution::par_unseq 的 std::for_each 不适用于 GCC 但适用于 MSVC

c++ - 为文件写入实现互斥锁

c++ - 我应该分配还是重置一个 unique_ptr?