C++20 constexpr vector and string not working(C++20常量表达式向量和字符串不起作用)
问题描述
尝试创建constexpr
std::string
和std::vector
对象时遇到奇怪的编译器错误:
#include <vector>
#include <string>
int main()
{
constexpr std::string cs{ "hello" };
constexpr std::vector cv{ 1, 2, 3 };
return 0;
}
编译器报告";表达式必须具有常量值:
我错过了什么吗?我使用的是最新的Microsoft Visual Studio 2019版本:16.11.4,参考(https://en.cppreference.com/w/cpp/compiler_support)说明此编译器版本支持constexpr
字符串和向量:
我还尝试了constexpr std::array
,它确实有效。该问题是否与向量关联的动态内存分配有关?
推荐答案
您的程序实际上是格式错误的,尽管错误可能很难理解。constexpr
C++20中的分配支持是有限的-您只能进行临时分配。也就是说,必须在常量评估结束时完全释放分配。
所以您不能这样写:
int main() {
constexpr std::vector<int> v = {1, 2, 3};
}
因为v
的分配是持续的-它是非暂时性的。这就是错误告诉您的:
<source>(6): error C2131: expression did not evaluate to a constant
<source>(6): note: (sub-)object points to memory which was heap allocated during constant evaluation
v
不能是常量,因为它仍在保留堆分配,而且不允许这样做。
但您可以写入this:
constexpr int f() {
std::vector<int> v = {1, 2, 3};
return v.size();
}
static_assert(f() == 3);
在这里,v
的分配是暂时的-f()
返回时将释放内存。但我们仍然可以在constexpr
期间使用std::vector
。
这篇关于C++20常量表达式向量和字符串不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++20常量表达式向量和字符串不起作用
基础教程推荐
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++,'if' 表达式中的变量声明 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17