소개
constexpr
상수 표현 이 필요한 상황에서 무언가를 평가할 수 있음을 구현에 알리는 방법으로 소개되지 않았습니다 . 적합한 구현은 C ++ 11 이전에 이것을 증명할 수있었습니다.
구현이 증명할 수없는 것은 특정 코드 의 의도 입니다.
- 개발자가이 엔티티로 표현하고자하는 것은 무엇입니까?
- 코드 가 작동하기 때문에 상수 표현식 에서 코드를 맹목적으로 허용해야합니까 ?
세상이 없으면 constexpr
무엇이 될까요?
라이브러리를 개발 중이고 interval의 모든 정수의 합을 계산할 수 있기를 원한다고 가정 해 봅시다 (0,N]
.
int f (int n) {
return n > 0 ? n + f (n-1) : n;
}
의도 부족
컴파일러는 전달 된 인수가 변환 중에 알려진 경우 상수 표현식 에서 위 함수를 호출 할 수 있음을 쉽게 증명할 수 있습니다 . 그러나 당신은 이것을 의도로 선언하지 않았습니다-그것은 단지 사건이되었습니다.
이제 다른 누군가가 와서 함수를 읽고 컴파일러와 동일한 분석을 수행합니다. " 아,이 함수는 상수 표현으로 사용할 수 있습니다!" 다음 코드를 작성합니다.
T arr[f(10)]; // freakin' magic
최적화
당신은, int로서 "최고" 라이브러리 개발자, 즉 결정 f
호출되는 경우 결과를 캐시한다 누가 같은 값 집합을 계속해서 계산하고 싶습니까?
int func (int n) {
static std::map<int, int> _cached;
if (_cached.find (n) == _cached.end ())
_cached[n] = n > 0 ? n + func (n-1) : n;
return _cached[n];
}
결과
바보 같은 최적화를 도입함으로써 상수 표현 이 필요한 상황에서 발생한 함수의 모든 사용을 중단했습니다 .
당신은 함수가에서 사용할 것을 약속 결코 일정한 표현 , 그리고없이 constexpr
같은 약속을 제공하는 방법이 없습니다.
왜 우리는 필요 constexpr
합니까?
constexpr 의 주요 사용법은 intent 선언 입니다.
엔터티가로 표시되지 않은 경우 constexpr
- 상수 표현식에 . 그리고 그것이더라도, 우리는 컴파일러를 사용하여 그러한 상황을 진단합니다 (우리의 의도를 무시하기 때문에).
constexpr
? 를 반환하는 재귀 함수를 정의 할 수 있습니까 ? 그렇다면 사용법을 볼 수 있습니다.