C++20下constexpr修饰std::string与std::vector编译错误排查
问题解决说明
标准层面的约束
C++20引入的constexpr std::vector和constexpr std::string特性,存在明确的使用限制:常量求值过程中分配的动态内存,必须在常量求值阶段完全释放,不允许留存到运行时。
你直接将std::string、std::vector定义为constexpr变量的写法,要求容器分配的内存从编译期持续到程序运行阶段,违反了上述标准约束,因此会触发编译错误。
而std::array属于固定大小的栈上容器,无需动态内存分配,不受该规则限制,所以可以直接定义为constexpr变量。
合法的constexpr容器用法示例如下,仅允许在编译期函数内部使用,求值结束后容器内存即被释放:
constexpr int get_vector_value() { std::vector<int> cv{1, 2, 3}; cv.push_back(4); return cv.at(3); } // 编译期求值得到常量 constexpr int res = get_vector_value(); // 可正常编译
VS环境配置检查
VS2019 16.11.4确实支持该特性,但需要手动开启C++20标准支持,操作步骤如下:
- 打开项目属性页,依次进入「配置属性」→「C/C++」→「语言」分类
- 将「C++ 语言标准」选项设置为「ISO C20 标准(/std:c20)」或更高版本
- 保存配置后重新编译即可
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

