首頁  >  文章  >  後端開發  >  為什麼在使用類別作為預設參數時,GCC 和 Clang 會拋出「需要預設成員初始值設定項目」?

為什麼在使用類別作為預設參數時,GCC 和 Clang 會拋出「需要預設成員初始值設定項目」?

Barbara Streisand
Barbara Streisand原創
2024-10-26 10:49:02497瀏覽

Why Does GCC and Clang Throw

理解編譯器錯誤:「在其封閉類別結束之前需要預設成員初始值設定項」

嘗試定義一個使用該類別作為預設參數值的函數中類別成員的預設成員初始值設定項。像 gcc 和 clang 這樣的編譯器在使用此構造時會遇到困難,而 msvc2017 可以成功處理它。

考慮以下程式碼片段:

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &amp;hints = Hints());
};</code>

提供的程式碼旨在為 numOfMaxEasyHandles 定義預設值Hints 結構的成員,用作 Create 函數中的預設參數。但是,gcc 和clang 無法編譯此程式碼,並發出錯誤:

default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class

錯誤原因

此錯誤是由於gcc 和中的錯誤而發生的clang涉及類別中用作函數中預設參數的預設成員初始值設定項的處理。編譯器希望預設成員初始值設定項在類別定義本身中定義,而不是在函數體內定義。

可能的解決方法

要解決此問題,有兩種潛在的解決方法:

  1. 取消註釋Hints>
  2. 取消註釋Hints (){}: 將空建構函式加入Hints 結構可以緩解編譯器錯誤。但是,這種方法可能並不理想,因為它違反了預設成員初始值設定項的目的。
使用 Hints() = default: 此語句明確定義了 Hints 結構的預設建構子。雖然它消除了 msvc2017 中的編譯器錯誤,但由於上述 bug,它導致程式碼與 gcc 和 clang 不相容。

以上是為什麼在使用類別作為預設參數時,GCC 和 Clang 會拋出「需要預設成員初始值設定項目」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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