為什麼在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>
<code class="cpp">auto test = Foo(0); // Constructor initialization</code>
對編碼實踐的影響
雖然顯式預設或刪除建構函式以前被認為是一種好的做法,但C 20 標準的變化表明它不再有利。在 C 20 及更高版本中,建議依賴隱式預設建構函數行為,並避免明確預設或刪除建構函數,除非有特定原因這樣做。以上是為什麼 C 20 中明確預設或刪除的建構子會導致聚合初始化失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!