理解編譯器錯誤:「類別結束前需要預設成員初始值設定項」
嘗試使用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中文網其他相關文章!