>  기사  >  백엔드 개발  >  템플릿이 지정되지 않은 C 함수에서 `if constexpr`이 예상대로 작동하지 않는 이유는 무엇입니까?

템플릿이 지정되지 않은 C 함수에서 `if constexpr`이 예상대로 작동하지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-06 10:54:02496검색

Why Doesn't `if constexpr` Work as Expected in Non-Templated C   Functions?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.