首页 > 后端开发 > C++ > 为什么在 C 20 中使用 `constexpr std::vector` 和 `constexpr std::string` 时会出现编译器错误?

为什么在 C 20 中使用 `constexpr std::vector` 和 `constexpr std::string` 时会出现编译器错误?

Barbara Streisand
发布: 2024-12-01 11:48:10
原创
487 人浏览过

Why Do I Get Compiler Errors When Using `constexpr std::vector` and `constexpr std::string` in C  20?

C 20 中的 Constexpr 向量和字符串:解决编译器错误

尝试创建 constexpr std::string 和 std::vector 对象时,您可能会遇到编译器错误,指示表达式缺少常量值。尽管使用支持 constexpr 字符串和向量的最新 Microsoft Visual Studio 2019 版本,此错误可能仍然存在。

瞬态分配与非瞬态分配

问题这是因为 C 20 中的 constexpr 分配支持仅限于瞬态分配。瞬态分配在常量求值结束时被释放,从而防止分配的持久性。

在您的情况下,std::vector 和 std::string 的使用涉及动态内存分配,这是非瞬态的。因此,编译器将其标记为违反瞬态分配限制。

constexpr std::vector cv{ 1, 2, 3 };
登录后复制

Constexpr 中瞬态分配的解决方案

要解决此问题并使用向量或constexpr 中的字符串,确保分配是暂时的。这意味着在常量求值结束之前必须完全释放内存分配。

例如,您可以使用 constexpr 中的函数来执行分配,如下例所示:

constexpr int f() {
    std::vector<int> v = {1, 2, 3};
    return v.size();
}

static_assert(f() == 3);
登录后复制

在这种情况下,向量的分配是暂时的,因为函数返回时内存被释放。这允许在 constexpr 时间内使用 std::vector。

以上是为什么在 C 20 中使用 `constexpr std::vector` 和 `constexpr std::string` 时会出现编译器错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板