상수 표현식은 컴파일 타임에 평가할 수 있는 표현식입니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!