首頁 >後端開發 >C++ >為什麼明確預設或刪除建構函式會阻止 C 20 中的聚合初始化?

為什麼明確預設或刪除建構函式會阻止 C 20 中的聚合初始化?

Patricia Arquette
Patricia Arquette原創
2024-11-02 16:28:03291瀏覽

Why Does Explicitly Defaulting or Deleting Constructors Prevent Aggregate Initialization in C  20?

為什麼明確預設或刪除的建構子會阻止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中文網其他相關文章!

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