首頁 > 後端開發 > C++ > 使用非平凡建構函式作為預設參數時,為什麼會出現「類別結束前需要預設成員初始值設定項」錯誤?

使用非平凡建構函式作為預設參數時,為什麼會出現「類別結束前需要預設成員初始值設定項」錯誤?

DDD
發布: 2024-10-29 08:04:02
原創
798 人瀏覽過

Why Does

理解編譯器錯誤「Default Member Initializer required Before Class End」

在此程式碼片段中:

<code class="cpp">#include <cassert>
#include <iostream>
#include <cstdlib>

class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &hints = Hints());
};

Downloader* Downloader::Create(const Hints &hints)
{
    std::cout << hints.numOfMaxEasyHandles << std::endl;
    return nullptr;
}</code>
登入後複製

在此程式碼片段中:

當嘗試定義建構Hints 結構實例的預設參數時,Clang 和GCC 編譯器會引發錯誤訊息「在其封閉類別結束之前需要預設成員初始值設定項目」。

原因錯誤

發生此錯誤是因為Create 函數的預設參數是一個非平凡的建構函數,它需要在Hints 結構的宣告中定義預設成員初始值設定項。如果沒有成員初始值設定項,則在使用預設參數時,編譯器無法確定 numOfMaxEasyHandles 成員的初始值。

解決方案

<code class="cpp">struct Hints
{       
    int32_t numOfMaxEasyHandles = 8;
    Hints() {}  // Default member initializer
};</code>
登入後複製

要解決此問題,提示結構應包含預設成員初始值設定項,如下所示:

使用預設成員初始值設定項,Clang 和GCC 將能夠成功編譯程式碼。請注意,Hints 結構需要定義一個明確預設建構函式才能使此解決方案正常運作。

GCC 和 Clang Bug

<code class="cpp">Hints() = default;</code>
登入後複製

人們可能會注意到以下行:

無法解決 Clang 和 GCC 的問題。這是這些編譯器中的一個已知錯誤,在某些上下文中,例如當建構函式用作預設參數時,無法正確識別非平凡建構函式的預設成員初始值設定項。

以上是使用非平凡建構函式作為預設參數時,為什麼會出現「類別結束前需要預設成員初始值設定項」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板