> 백엔드 개발 > C++ > 본문

C 17의 템플릿이 아닌 함수에서 `if constexpr`을 사용할 수 없는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-06 04:13:02
원래의
488명이 탐색했습니다.

Why Can't I Use `if constexpr` in Non-Templated Functions in C  17?

C 17의 "if constexpr"은 템플릿 함수로 제한

C 17에서는 "if constexpr"의 도입으로 관심이 촉발되었습니다. 컴파일 타임 상수를 기반으로 조건부로 코드를 실행하는 기능. 그러나 템플릿이 아닌 함수에서 사용하려고 하면 문제가 발생합니다.

다음 코드를 고려하세요.

<code class="cpp">#include <iostream>
#include <type_traits>

void print(auto value)
{
  // Compile-time check if value is a pointer
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}

int main()
{
  // Error when printing a non-pointer
  print(100);
}</code>
로그인 후 복사

이 코드는 템플릿 함수에서 오류 없이 컴파일되지만 다음 오류로 인해 실패합니다. print와 같은 템플릿이 아닌 함수에 배치하면 컴파일 오류가 발생합니다. 그 이유는 "if constexpr"의 동작에 있습니다.

"if constexpr"은 템플릿 코드의 조건부 컴파일을 허용하도록 설계되었습니다. 템플릿 함수에서 컴파일러는 컴파일 타임에 매개변수의 유형을 추론하여 유형에 따라 적절한 코드 경로를 선택할 수 있도록 합니다. 이 경우 인쇄 함수가 템플릿화되면 컴파일 타임에 값이 포인터인지 여부를 식별하고 해당 코드 브랜치를 실행할 수 있습니다.

그러나 템플릿화되지 않은 함수에서는 값의 유형을 알 수 있습니다. 런타임에만 "if constexpr"이 효과가 없게 됩니다. 컴파일러는 조건부의 두 분기를 모두 실행 가능한 코드로 처리하므로 값이 정수일 때 분기하기 위해 Ptr의 값을 역참조하려고 하면 컴파일 오류가 발생합니다.

이 문제를 방지하려면 " if constexpr"을 템플릿 함수 내에서 사용하거나 템플릿이 아닌 함수에 명시적인 유형 정보를 제공하여 컴파일 시간 유형 추론을 보장합니다.

위 내용은 C 17의 템플릿이 아닌 함수에서 `if constexpr`을 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!