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中文網其他相關文章!