Constexpr If-Else 절의 불이행 방지
C에서는 모든 constexpr if 조건이 if-else 문이 충족됩니다. 그러한 주장이 없으면 else 절이 예기치 않게 취해질 수 있습니다.
다음 코드를 고려하십시오.
if constexpr(condition1){ ... } else if constexpr (condition2) { .... } else if constexpr (condition3) { .... } else { // I want the else clause never taken. But I heard the code below is not allowed static_assert(false); }
모든 조건이 상호 일치해야 하므로 else 절은 절대 채택되지 않을 것이라고 가정할 수도 있습니다. 독점적인. 그러나 C 표준에 따르면 이러한 단언은 허용되지 않습니다.
해결 방법: 템플릿 종속성
else 절이 사용되는 것을 방지하려면 다음을 만들어야 합니다. 템플릿 매개변수에 따라 삭제된 문입니다. 이는 다음 코드를 사용하여 달성할 수 있습니다.
template <class... T> constexpr std::false_type always_false{}; if constexpr(condition1){ ... } else if constexpr (condition2) { .... } else if constexpr (condition3) { .... } else { static_assert(always_false<T>); }
추론
C 표준에서는 유효한 전문화를 생성할 수 없는 경우 프로그램이 잘못된 형식이라고 명시합니다. 템플릿 또는 템플릿 내의 하위 설명입니다. 삭제된 문을 템플릿 매개변수에 종속되게 만듦으로써 컴파일러는 조건이 충족되지 않을 때 유효한 특수화가 생성되지 않도록 보장하여 else 절이 사용되는 것을 효과적으로 방지할 수 있습니다.
위 내용은 C `constexpr if-else` 체인에서 `else` 절이 실행되지 않도록 하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!