破壞聚合初始化:C 20 修改的影響
自C 17 過渡到C 20 以來,聚合初始化發生了重大變化當顯式構造函數被預設或刪除時。在本文中,我們深入研究此修改背後的原因並探討其意義。
更改的起源
之前,在 C 17 中,允許聚合初始化具有明確預設或刪除建構函數的結構。然而,隨著 C 20 的採用,C 標準進行了修訂,禁止使用任何使用者宣告的建構函式對結構進行聚合初始化,包括預設或刪除的建構子。
理由
此變更背後的關鍵動機在於解決聚合初始化中潛在的不一致和混亂。標準委員會認識到,允許使用使用者聲明的建構函數(即使是預設或刪除的構造函數)對結構進行聚合初始化,會導致意外且經常錯誤的行為。
考慮以下範例:
<code class="cpp">struct Foo { Foo() = default; int bar; }; int main() { Foo test = { 0 }; // Error: Cannot initialize due to defaulted constructor }</code>
在這種情況下,明確提供預設構造函數,即使它本質上對結構的初始化沒有影響。但是,在這種情況下允許聚合初始化可能會繞過構造函數,從而可能導致未定義的行為或不一致。
對開發人員實踐的影響
聚合初始化實踐的變化改變了構建和初始化類別和結構的推薦方法。以前,通常的做法是明確預設建構函式來提高程式碼可讀性並確保語法更清晰。但是,根據當前標準,不再建議為需要初始化的類別或結構使用預設建構函數。
結論
C 20 中聚合初始化的修改旨在提高程式碼的清晰度、一致性和安全性。透過禁止使用使用者聲明的建構函數對結構進行聚合初始化,該標準旨在消除潛在的陷阱並提高程式碼庫的整體可靠性。開發人員應該相應地調整他們的實踐以適應這些變化,從而產生更健壯和可維護的 C 應用程式。
以上是為什麼 C 20 禁止使用使用者宣告的建構函式對結構進行聚合初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!