首頁 > 後端開發 > C++ > 為什麼在 C 20 中使用 `constexpr std::vector` 和 `constexpr std::string` 時會出現編譯器錯誤?

為什麼在 C 20 中使用 `constexpr std::vector` 和 `constexpr std::string` 時會出現編譯器錯誤?

Barbara Streisand
發布: 2024-12-01 11:48:10
原創
484 人瀏覽過

Why Do I Get Compiler Errors When Using `constexpr std::vector` and `constexpr std::string` in C  20?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板