目標是取得從constexpr 計算的編譯時常數(constexpr 值)函數,都在同一個類別命名空間內。
class C1 { constexpr static int foo(int x) { return x + 1; } constexpr static int bar = foo(sizeof(int)); };
但是,這在 g -4.5.3 和 g -4.6.3 上都失敗了,因為在初始化器中使用了非常量表達式。
class C2 { constexpr static int foo(int x) { return x + 1; } constexpr static int bar; }; constexpr int C2::bar = C2::foo(sizeof(int));
雖然這在 g -4.5.3、g -4.6.3 上編譯顯示不一致和重新聲明錯誤。
根據C 標準(第9.4.2 節), constexpr 靜態資料成員只能用大括號或等於初始化器宣告類別定義,其中每個初始化子句都必須是常量表達式。
在「第二次嘗試」中,聲明缺少所需的大括號或等於初始值設定項。
與最初的假設相反,這兩次嘗試都失敗了。標準禁止在類別完整的上下文中初始化靜態 constexpr 資料成員。
以上是如何使用 C 中的靜態 constexpr 函數初始化靜態 constexpr 成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!