C 20 Constexpr 向量和字符串不起作用?瞬态分配的故事
当尝试创建 constexpr std::string 和 std::vector 对象时,您可能会遇到令人费解的编译器错误。尽管使用最新支持的 Visual Studio 版本,错误消息声称“表达式必须具有常量值。”
问题
提供的代码利用:
constexpr std::string cs{ "hello" }; constexpr std::vector cv{ 1, 2, 3 };
但是,编译器会抱怨,提示缺少细节。
解决方案
该问题源于 C 20 对 constexpr 分配的有限支持。具体来说,需要瞬时分配。这意味着在常量求值期间分配的任何内存都必须在求值完成之前释放。
由于动态内存分配的性质,向量不能存储为常量,因为它们的内存在求值后仍然存在。因此,出现了关于“指向常量求值期间分配的内存”的错误。
瞬态分配示例
虽然向量不能声明为常量,但它们可以在具有瞬态分配的 constexpr 函数中使用:
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
在此代码中,向量的内存是当 f() 返回时释放,使分配暂时并允许在 constexpr 函数中使用。
以上是为什么我的 C 20 `constexpr` `std::vector` 和 `std::string` 编译失败?的详细内容。更多信息请关注PHP中文网其他相关文章!