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