首页 > 后端开发 > C++ > 为什么我的 C 20 `constexpr` `std::vector` 和 `std::string` 编译失败?

为什么我的 C 20 `constexpr` `std::vector` 和 `std::string` 编译失败?

Patricia Arquette
发布: 2024-12-01 20:05:14
原创
745 人浏览过

Why Are My C  20 `constexpr` `std::vector` and `std::string` Failing Compilation?

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中文网其他相关文章!

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