了解constexpr 和動態記憶體分配與C 20 中的std::vector 和std::string 的不相容性
儘管有文件表示支援對於Microsoft Visual Studio 2019 版本中的constexpr std::string 和std::vector從16.11.4 開始,使用者在嘗試使用 constexpr 建立這些物件時可能會遇到錯誤。原因在於 C 20 中對 constexpr 分配的支援有限。
在 C 20 中,在 constexpr 求值期間允許瞬態分配。這意味著在常數求值期間分配的記憶體必須在其結論時完全釋放。然而,向量和字串動態分配內存,這可能會超出常數求值的範圍,從而違反了此規則。
錯誤訊息「表達式必須具有常數值」表示編譯器無法保證分配的記憶體記憶體將在 constexpr 計算結束時釋放。因此,嘗試建立 constexpr std::vector 和 std::string 物件會失敗。
相反,std::array 可以與 constexpr 一起使用,因為它不需要動態記憶體分配並且其生命週期得到保證僅限於恆定的評估週期。
要解決此問題,請確保僅在其生命週期短暫嘗試創建 constexpr 對象,這意味著它們在結束時完全釋放不斷的評價。此限制限制了 constexpr 上下文中動態記憶體分配的使用。
以上是為什麼我不能在 C 20 中將 `constexpr` 與 `std::vector` 和 `std::string` 一起使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!