> 백엔드 개발 > C++ > 상수 표현식에서 함수 매개변수를 사용할 수 없는 이유는 무엇입니까?

상수 표현식에서 함수 매개변수를 사용할 수 없는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-15 08:26:02
원래의
1084명이 탐색했습니다.

Why Can't I Use Function Parameters in Constant Expressions?

상수 표현식에서 함수 매개변수를 사용할 수 없는 이유는 무엇입니까?

상수 표현식은 컴파일 타임에 평가할 수 있는 표현식입니다. Constexpr 함수는 constexpr 매개변수로 호출하면 컴파일 타임에 평가할 수 있는 함수입니다.

코드에서 make_const 함수는 constexpr 함수입니다. 그러나 t1의 매개변수 i는 const로 지정되지 않았기 때문에 constexpr 매개변수가 아닙니다.

void t1(const int i)
{
    constexpr int ii = make_const(i);  // error: i is not a constant expression
}
로그인 후 복사

이 문제를 해결하려면 해당 유형을 const int로 변경하여 i를 상수 매개변수로 만들거나, t1을 constexpr 함수 자체로 정의하여:

void t1(const int i)  // const int i to make i a constant parameter
{
    constexpr int ii = make_const(i);
}
로그인 후 복사
constexpr int t1(const int i)  // constexpr t1 to make t1 a constexpr function
{
    return make_const(i);
}
로그인 후 복사

템플릿 내에서 constexpr 함수를 사용할 때 또 다른 문제가 발생합니다. constexpr 값을 반환하기 위한 함수입니다.

template<int i>
constexpr bool do_something(){
    return i;
}

constexpr int t1(const int i)
{
    return do_something<make_const(i)>();   // error: i is not a constant expression
}
로그인 후 복사

이 경우 컴파일러는 i 매개변수가 do_something에 전달된 템플릿 매개변수의 값에 따라 달라지므로 상수 표현식임을 보장할 수 없습니다. t1이 컴파일 타임에 평가될 수 있도록 하려면 템플릿 매개변수 i가 상수 표현식이어야 합니다.

대체 접근 방식은 std::variant 및 std::integral_constant를 사용하여 다음과 같은 컴파일 타임 상수를 생성하는 것입니다. 런타임 값과 함께 사용할 수 있습니다.

template<auto I>
using constant_t=std::integral_constant<decltype(I),I>;
template<auto I>
constexpr constant_t<I> constant_v={};
template<auto...Is>
using var_enum_t=std::variant<constant_t<Is>...>;
로그인 후 복사

이렇게 하면 다음을 사용하여 런타임에 선택할 수 있는 컴파일 타임 상수 변형을 생성할 수 있습니다. 표준::방문.

auto idx=var_index<5>(3/* 3 can be runtime */);
std::visit([](auto three){
  // three is a compile time value here
}, idx);
로그인 후 복사

위 내용은 상수 표현식에서 함수 매개변수를 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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