C 20 中的Constexpr 向量和字串:解決編譯器錯誤
嘗試建立constexpr std::string 和std::vectorvector物件時,您可能會遇到編譯器錯誤,指示表達式缺少常數值。儘管使用支援 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中文網其他相關文章!