C 11 允許類內初始化:是什麼推動了這項變化?
在 C 11 之前的時代,類別內初始化是僅限於靜態常數成員。此限制歸因於需要避免多翻譯單元場景中的連結器複雜性。
但是,隨著 C 11 的引入,這些限制被放寬,允許非靜態和非靜態的類別內初始化。 const 成員 (§12.6.2/8)。
雖然限制的最初推理仍然有效,但 C 11 實作了一個解決方案,將負擔從連結器轉移到編譯器。編譯器現在不再允許多個定義,而是處理初始化。
對於有大括號或等於初始化器的非靜態成員,初始化依照 8.5 執行。否則,如果它是變體成員 (9.5),則不會發生初始化。在所有其他情況下,執行預設初始化 (8.5)。
此外,用 constexpr 說明符標記的非常量靜態成員現在可以在類別中初始化 (9.4.2)。
此變更簡化了程式碼維護並提供了更大的靈活性,但它增加了程式設計規則的一些複雜性。例如,如果一個成員指定了多個初始值設定項,則初始化值由所使用的建構函數決定。在呼叫預設建構函數的情況下,將使用類別內初始值設定項。如果非預設建構函數指定了一個值,則類別內初始值設定項將被忽略。
整體而言,這項變更反映了對改進開發人員人體工學的日益重視,而不犧牲連結器可靠性。編譯器現在承擔更複雜的角色來促進這些功能,同時保持關注點的清晰分離。
以上是為什麼 C 11 為非靜態成員啟用類別內初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!