為什麼明確預設或刪除的建構子會阻止C 20 中的聚合初始化
C 20 引入了影響聚合初始化的變更。以前,允許的結構可以明確預設或刪除建構子。然而,現在情況不再是這樣了。
推理
這一更改的動機是希望改進 C 中的初始化語義並使它們更加一致。允許使用明確預設或刪除的建構函式進行聚合初始化可能會導致混亂和意外的行為。
例如,考慮以下程式碼:
<code class="cpp">struct X { int i{4}; X() = default; }; int main() { X x1(3); // ill-formed - no matching c’tor X x2{3}; // compiles! }</code>
在 C 17 中,x2 會初始化 i 成員變數為 3。但是,此行為與使用者定義的建構函數不一致。此更改解決了此不一致問題。
替代解決方案
要解決此錯誤,不應將明確預設或刪除的建構子用於聚合類型。相反,請考慮省略建構函數或使用使用者定義的建構子。
以上是為什麼明確預設或刪除建構函式會阻止 C 20 中的聚合初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!