C 17의 constexpr이 템플릿이 아닌 함수에서 작동하지 않는 경우
소개
The C 17 표준에서는 상수 표현식을 기반으로 조건부 실행을 허용하는 if constexpr 구문을 도입했습니다. 그러나 템플릿 함수와 비템플릿 함수에서 사용할 때 constexpr 동작이 다른 것으로 관찰되었습니다.
문제
다음 비템플릿 함수를 고려하세요.
<code class="cpp">void print() { auto value = 100; if constexpr (std::is_pointer_v<decltype(value)>){ std::cout << "Ptr to " << *value << std::endl; // Error } else { std::cout << "Ref to " << value << std::endl; } }</code>
이 코드는 추론된 유형 int에 대해 *값이 유효하지 않기 때문에 컴파일 오류를 발생시킵니다.
답변
이 동작은 의도적으로 설계된 것입니다. 템플릿 함수에서 constexpr이 특정 템플릿 특수화에 유효하지 않은 분기 인스턴스화를 피할 수 있는 경우. 그러나 템플릿이 아닌 함수에서는 if constexpr이 사용되지 않은 분기의 컴파일을 억제하지 않습니다.
사용하지 않은 분기가 유효하지 않은 경우에도 if constexpr 문의 두 가지 분기가 모두 구문 분석되고 분석됩니다. 따라서 위 코드에서 컴파일러는 int 유형에 대한 *값을 평가하려고 시도하여 오류가 발생합니다.
결론
이 차이점을 이해하는 것이 중요합니다. if constexpr을 사용할 때. 템플릿이 아닌 함수에서는 입력 매개변수의 가능한 모든 값에 대해 유효함이 보장되는 상수 표현식을 확인하는 데에만 사용해야 합니다.
위 내용은 템플릿이 지정되지 않은 C 함수에서 `if constexpr`이 예상대로 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!