首页 > 后端开发 > C++ > 为什么 C 20 中的'constexpr”向量和字符串会导致瞬态分配错误?

为什么 C 20 中的'constexpr”向量和字符串会导致瞬态分配错误?

Linda Hamilton
发布: 2024-12-03 06:20:14
原创
302 人浏览过

Why Do `constexpr` Vectors and Strings in C  20 Lead to Transient Allocation Errors?

constexpr C 20 向量和字符串:瞬态分配困境

尽管 C 20 标准引入了对向量和字符串的 constexpr 支持,但开发人员可能尝试创建这些 constexpr 对象时遇到意外的编译器错误

在下面的示例中,编译器会引发错误,指示表达式需要常量值:

#include <vector>
#include <string>

int main()
{
    constexpr std::string cs{ "hello" };
    constexpr std::vector cv{ 1, 2, 3 };
    return 0;
}
登录后复制

尽管 Visual Studio 2019 版本 16.11.4 声称支持 constexpr 向量和字符串,此问题源于 C 20 的 constexpr 分配语义的限制。

与constexpr 变量,C 20 constexpr 容器仅支持瞬态分配。这意味着在常量求值期间分配的内存必须在求值结束之前完全释放。然而,向量本质上需要动态内存分配,这阻碍了它们满足此要求的能力。

因此,由于向量分配持续存在,此代码被认为是格式错误的:

constexpr std::vector<int> v = {1, 2, 3};
登录后复制

但是,瞬态分配仍然可以在 constexpr 上下文中使用。考虑这个例子:

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

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

在这种情况下,向量的内存分配是暂时的,因为当 f() 返回时内存被释放。因此,在 constexpr 求值期间允许使用 std::vectors,前提是分配是暂时的。

以上是为什么 C 20 中的'constexpr”向量和字符串会导致瞬态分配错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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