首頁 > 後端開發 > C++ > 為什麼我的 C 20 `constexpr` `std::vector` 和 `std::string` 不工作?

為什麼我的 C 20 `constexpr` `std::vector` 和 `std::string` 不工作?

Mary-Kate Olsen
發布: 2024-12-06 10:42:13
原創
540 人瀏覽過

Why Aren't My C  20 `constexpr` `std::vector` and `std::string` Working?

C 20 constexpr Vector 和String 不工作

在此問題中,程式設計師嘗試建立建立d::string 和texprstd 的conss

在此問題中,程式設計師嘗試建立定義::string 和texprstd 的conss>

此問題::向量,但遇到編譯器錯誤,指出表達式必須具有常數值。儘管使用最新的 Microsoft Visual Studio 2019 版本,該版本支援 constexpr 字串和向量,但仍出現此問題。

問題說明

此錯誤源自於有限的 constexpr 分配支援C 20,僅允許瞬時分配。瞬時分配要求在常數求值結束時完全釋放已分配的記憶體。

無效程式碼範例

int main() {
    constexpr std::vector<int> v = {1, 2, 3};
}
登入後複製
以下範例說明了錯誤:

這裡,v 的分配仍然存在,使其成為非暫時性的。編譯器正確地產生錯誤,指示表達式未求值為常數,因為 v 在常數求值期間保留堆分配。

有效程式碼範例

constexpr int f() {
    std::vector<int> v = {1, 2, 3};
    return v.size();
}

static_assert(f() == 3);
登入後複製
但是,在 constexpr 時間內使用 std::vector 可以透過瞬態分配來實現。

在此範例中,v 的分配是暫時的,因為當 f() 返回時記憶體被釋放。這允許在 constexpr 時間內使用 std::vector。

以上是為什麼我的 C 20 `constexpr` `std::vector` 和 `std::string` 不工作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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