Constexpr 使用靜態函數初始化靜態成員
原始問題:
在C 中,是否可以從constexpr 函數計算constexpr 值(編譯時常數)並將其儲存為 a的靜態成員class?
第一次嘗試和編譯器的回應:
第一次嘗試在類別中定義靜態constexpr 函數foo 並使用foo 初始化靜態constexpr 成員bar 失敗g -4.5.3 和 g均存在錯誤-4.6.3.
解釋:
根據C 標準,可以使用大括號或等號在類別定義中初始化靜態constexpr 資料成員-初始化器,其中每個初始化器子句必須是常數表達式。提供的程式碼違反了此規則,因為 bar 的初始化依賴於類別體內的 const 表達式 foo(sizeof(int)),使其不是常數表達式。
進一步分析:
進一步的嘗試,包括將constexpr 函數定義移到類體之外,仍然導致g -4.6.3 中出現錯誤,突出顯示特定於編譯器的錯誤
結論:
根據C 標準,在 a的定義之外,不允許使用涉及 constexpr 函數呼叫的初始值設定項來初始化靜態 constexpr 資料成員。 constexpr 函數或 constexpr 建構子。這是因為 constexpr 變數必須可用作成員函數體內的編譯時常數。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3