有状态元编程:在 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中文网其他相关文章!