首頁 >後端開發 >C++ >為什麼 gcc 和 clang 即使有預設建構函式也需要預設成員初始值設定項?

為什麼 gcc 和 clang 即使有預設建構函式也需要預設成員初始值設定項?

Barbara Streisand
Barbara Streisand原創
2024-10-28 06:46:02313瀏覽

Why Does gcc and clang Require a Default Member Initializer Even with a Default Constructor?

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

嘗試使用gcc8.2 和編譯以下代碼時clang7.0 中,用戶可能會遇到以下錯誤消息:

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

此錯誤是由於Downloader 類的Hints 結構中的numOfMaxEasyHandles 變量的默認成員初始值設定項存在微妙問題而發生的。

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
        //Hints(){}          // <= if I uncomment this all works gcc+clang+msvc
        //Hints() = default; // <= if I uncomment this neither clang no gcc works (msvc - works)
    };
};</code>

錯誤的根本原因:

如果 Hints 結構的預設建構子 Hints() 未註釋,錯誤訊息就會消失。但是,如果將預設建構函式替換為 Hints() = default;,則該錯誤在 gcc 和 clang 中仍然存在。

此行為是 gcc 和 clang 中的已知錯誤。在這種情況下,編譯器要求在結構定義本身內定義 numOfMaxEasyHandles 的預設成員初始值設定項,即使存在預設建構函式也是如此。

MSVC 的行為:

相較之下,MSVC2017 不會出現此錯誤,並且允許程式碼編譯而不會出現任何問題。這是因為 MSVC 處理預設成員初始值設定項目的方式與 gcc 和 clang 不同。

解決方法:

要解決gcc 和clang 中的錯誤,只需定義預設成員即可結構定義中的初始化程序:

<code class="cpp">struct Hints
{       
    int32_t numOfMaxEasyHandles = 8;
};</code>

透過此修改,程式碼應該在所有三個編譯器中成功編譯。

以上是為什麼 gcc 和 clang 即使有預設建構函式也需要預設成員初始值設定項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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