首頁 > 後端開發 > C++ > 為什麼 C 20 中明確預設或刪除的建構子會導致聚合初始化失敗?

為什麼 C 20 中明確預設或刪除的建構子會導致聚合初始化失敗?

DDD
發布: 2024-11-02 18:24:30
原創
224 人瀏覽過

Why Does Aggregate Initialization Fail with Explicitly Defaulted or Deleted Constructors in C  20?

為什麼在C 20 中明確預設或刪除的建構子聚合初始化失敗

在C 20 中,明確預設或刪除的結構體的聚合初始化不再支援建構函式。此更改是 C 標準修訂的結果。在 C 20 之前,允許對沒有建構函式或僅具有明確預設或刪除建構函式的結構進行聚合初始化。然而,在 C 20 中,標準已更新為規定聚合初始化僅適用於沒有使用者宣告或繼承的建構子的結構。

更改背後的原因

引入此更改是為了解決意外且令人困惑的初始化行為的問題。在 C 的早期版本中,明確預設或刪除的建構函式可能允許聚合初始化,即使它不是有意的。這可能會導致意外的轉換和錯誤。透過消除這些情況下的聚合初始化,該標準確保初始化始終透過建構函數進行,從而產生一致且可預測的行為。

範例

在C 之前在C 20 中,以下程式碼編譯時不會出現錯誤:

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

auto test = Foo { 0 }; // Aggregate initialization</code>
登入後複製
但是,在C 20中,相同的程式碼會引發編譯器錯誤,因為建構函式是明確預設的,並且不再允許聚合初始化。要解決此問題,可以刪除明確預設的建構函數,或者可以使用建構函數明確完成初始化:

<code class="cpp">auto test = Foo(0); // Constructor initialization</code>
登入後複製

對編碼實踐的影響

雖然顯式預設或刪除建構函式以前被認為是一種好的做法,但C 20 標準的變化表明它不再有利。在 C 20 及更高版本中,建議依賴隱式預設建構函數行為,並避免明確預設或刪除建構函數,除非有特定原因這樣做。

以上是為什麼 C 20 中明確預設或刪除的建構子會導致聚合初始化失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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