>백엔드 개발 >C++ >Consteval 함수는 함수 인수에 의존하는 템플릿 매개변수를 허용할 수 있습니까?

Consteval 함수는 함수 인수에 의존하는 템플릿 매개변수를 허용할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-24 01:35:01452검색

Can Consteval Functions Allow Template Parameters Reliant on Function Arguments?

Consteval 함수가 함수 인수에 의존하는 템플릿 매개변수를 활성화할 수 있나요?

C 17에서 아래 스니펫과 같은 constexpr 함수는 유효하지 않습니다.

<code class="cpp">constexpr int foo(int i) {
    return std::integral_constant<int, i>::value;
}</code>

컴파일 시 foo의 평가에도 불구하고 컴파일러에서는 런타임 시 실행할 수 있어야 하므로 템플릿 인스턴스화를 방해합니다.

C 20에는 컴파일 시 평가를 시행하는 consteval 함수가 도입되었습니다. 이것이 다음과 같은 코드를 허용하는지 궁금할 수도 있습니다.

<code class="cpp">consteval int foo(int i) {
    return std::integral_constant<int, i>::value;
}</code>

대답은 아니요입니다.

논문의 잠재적인 변경 사항은 비템플릿의 단일 입력을 변경할 수 없습니다. 기능 정의. 게다가 이 코드가 유효하다면 std::integral_constant 유형의 변수를 선언할 가능성이 열릴 것입니다. 이는 ODR(단일 정의 규칙) 측면에서 매우 제한적인 것으로 보입니다.

또한 이 문서에서는 다음 예를 통해 매개변수가 핵심 상수 표현식으로 처리되지 않음을 보여줍니다.

<code class="cpp">consteval int sqrsqr(int n) {
  return sqr(sqr(n)); // Not a constant-expression at this point, but that's okay.
}</code>

본질적으로 함수 매개변수는 잠재적인 입력 불일치로 인해 항상 상수 표현식 상태가 부족합니다.

위 내용은 Consteval 함수는 함수 인수에 의존하는 템플릿 매개변수를 허용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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