"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++17의 템플릿이 아닌 함수에서 `if constexpr`을 사용할 수 없는 이유는 무엇입니까?

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

2024년 11월 26일에 게시됨
검색:144

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

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

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

다음 코드를 고려하세요.

#include 
#include 

void print(auto value)
{
  // Compile-time check if value is a pointer
  if constexpr (std::is_pointer_v)
    std::cout 

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

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

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

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

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3