首頁 > 後端開發 > C++ > 為什麼 C 20 中的「constexpr」向量和字串會導致瞬態分配錯誤?

為什麼 C 20 中的「constexpr」向量和字串會導致瞬態分配錯誤?

Linda Hamilton
發布: 2024-12-03 06:20:14
原創
373 人瀏覽過

Why Do `constexpr` Vectors and Strings in C  20 Lead to Transient Allocation Errors?

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

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