有狀態元程式設計:在C 語言中是否仍合法
C 中比較有爭議的元程式設計技術之一,有狀態元編程,依賴這個概念constexpr 計數器用於儲存和檢索元編程狀態。目前來看,這種技術在 C 14 下是合法的。但是,這提出了這樣的問題:這種情況是否會隨著 C 17 的引入而改變。
要理解當前的問題,請考慮以下基於以下實現:上一篇文章:
// State storage flag template <int N> struct flag { friend constexpr int adl_flag(flag<N>&); constexpr operator int() { return N; } }; // State writer template <int N> struct write { friend constexpr int adl_flag(flag<N>) { return N; } static constexpr int value = N; }; // State reader template <int N, int = adl_flag(flag<N>{})> constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{})) { return R; } // Stateful counter template <int N = 0> constexpr int counter(int R = write<read(0, flag<0>{}) + N>::value) { return R; }
該技術的使用如下:
// Check if counter is stateful with static assertion static_assert(counter() != counter(), "Your compiler is mad at you"); // Template specialization based on counter state template<int = counter()> struct S {}; // Check if template specializations differ with static assertion static_assert(!std::is_same_v<S<>, S<>, "This is ridiculous");
但是,狀態元編程的合法性在CWG Active Issue 2118 中受到質疑。此問題建議使用友元由於其晦澀難懂的性質,模板中用於捕獲和檢索元編程狀態的函數應被視為格式錯誤。
截至 2015 年 5 月,CWG 同意應禁止此類技術,但尚未確定適當的機制。這個問題仍然活躍,在做出決定之前,有狀態元程式設計在 C 中仍然是合法的。然而,當禁止機制建立後,該技術可能會被追溯為缺陷報告。
以上是C 中的狀態元編程:C 14 中的一種合法技術,但這種情況在 C 17 中會改變嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!