상태 저장 메타 프로그래밍: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!