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