您提出的場景涉及使用靜態函數初始化類別中的constexpr 靜態成員conssssk函數。不幸的是,嘗試透過特定方法實現這一點在不同版本的 gcc 中遇到了挑戰。在本文中,我們剖析這些嘗試,探討錯誤的根本原因,並提供可能的解決方案或說明。
您的初始嘗試涉及聲明 constexpr 函數foo 和 constexpr 靜態成員 bar 在類體內,但這會導致編譯錯誤。它們表示函數呼叫不能存在於常數表達式中,且靜態類別成員不能具有非常量的初始值設定項。
第二次嘗試將聲明移到類別主體之外,但這仍然導致錯誤。值得注意的是,錯誤訊息提到靜態資料成員 bar 必須有一個初始值設定項,並且其宣告為 constexpr 與其先前在類別外的宣告相矛盾。
C 標準的第 9.4 節.2 規定文字類型的靜態資料成員可以在其聲明中包含 constexpr 說明符。但是,它們的初始化程序必須是大括號或等於初始化程序,並且其中的任何賦值表達式都必須是常數表達式。
在您的兩次嘗試中, bar 的聲明都缺少大括號或等於-初始化程序。因此,它們都不符合標準規定的要求。
但是,這種情況具有標準所施加的固有限制。它不允許在類別完整的上下文中初始化靜態 constexpr 資料成員。因此,使用大括號或等於初始化器規則僅適用於非靜態資料成員。
因此,使用依賴於類別完成的 constexpr 函數來初始化靜態 constexpr 資料成員變得不可能。此限制可能是由於要求 constexpr 變數必須可用作成員函數上下文中的編譯時常數表達式。因此,變數初始值設定項必須在函數體之前完全定義,但靜態資料成員的初始值設定項會導致在此上下文中未定義的函數調用,從而違反了常數表達式要求。
以上是如何在 C 中使用 Constexpr 靜態函數正確初始化 Constexpr 靜態成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!