首頁 >後端開發 >C++ >C 20 中具有明確預設或刪除建構函式的結構是否仍可進行聚合初始化?

C 20 中具有明確預設或刪除建構函式的結構是否仍可進行聚合初始化?

Barbara Streisand
Barbara Streisand原創
2024-11-04 13:43:02974瀏覽

Is Aggregate Initialization Still Possible for Structs with Explicitly Defaulted or Deleted Constructors in C  20?

明確建構子預設與刪除對C 20 中聚合初始化的影響

自引入C 20 以來,發生了顯著變化當構造函數被明確預設或刪除時聚合初始化的行為。在本次討論中,我們將調查此變更背後的原因及其對開發人員的影響。

C 20 中的變更

在C 20 之前,允許聚合初始化對於具有使用者提供的建構函式的結構,只要這些建構函式沒有明確預設或刪除。然而,在 C 20 中,此異常已被刪除,這意味著具有明確預設或刪除的建構函數的結構不能再使用聚合進行初始化。

更改背後的原因

引入C 20的更改是為了增強初始化語義的安全性和一致性。具體來說,這個問題圍繞著同一結構中聚合初始化和建構函數共存而引起的潛在混亂。考慮以下範例:

<code class="cpp">struct Foo
{
    int bar;
    Foo() = default;
};

int main()
{
    Foo f { 0 }; // Error in C++20
}</code>

在此範例中,struct Foo 有一個明確預設的建構子。在 C 20 之前,此程式碼是有效的,聚合初始化繞過預設建構函數。然而,在 C 20 中,這種行為是不允許的,以防止使用者無意中繞過關鍵的初始化邏輯。

開發人員的後果

C 20 中的變更刪除了先前可用的選項用於使用建構函式初始化結構。因此,依賴明確預設或刪除的建構函式進行聚合初始化的開發人員將需要重新評估他們的方法。

結論

刪除聚合初始化C 20 中具有明確預設或刪除建構函數的結構旨在提高初始化安全性和一致性。雖然這可能會給以前使用此技術的開發人員帶來一些不便,但增強清晰度和可靠性的整體好處超過了缺點。我們鼓勵開發人員調整他們的程式碼以適應這項變化,並在必要時考慮替代初始化方法。

以上是C 20 中具有明確預設或刪除建構函式的結構是否仍可進行聚合初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn