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