On this page
article
Change in Constexpr
1. constexpr
의 확장
- C++20부터 다양한 표준 라이브러리 함수와 알고리즘에
constexpr
적용됨 - STL의
algorithm
,numeric
함수들도 대부분constexpr
지원 - 컴파일 타임 연산의 범위가 대폭 확장됨
2. is_constant_evaluated()
(C++20)
- 함수가 컴파일 타임에 실행 중인지 런타임인지 판단하는 조건 분기용 함수
constexpr if
와 함께 사용
constexpr int foo() {
if (std::is_constant_evaluated()) {
return 1; // 컴파일 타임
} else {
return 2; // 런타임
}
}
3. consteval
(C++20)
- 무조건 컴파일 타임에만 실행되어야 하는 함수
- 즉시 함수 (Immediate Function)라고도 함
- 호출 위치가
constexpr
이어도 런타임이면 컴파일 에러 발생
consteval int square(int x) {
return x * x;
}
constexpr int v = square(3); // OK
int a = square(4); // ❌ 컴파일 에러: 런타임 호출 불가
4. constinit
(C++20)
- 변수의 초기값이 반드시 컴파일 타임에 계산되어야 함을 보장
- 전역변수, 정적변수에서 주로 사용됨
constinit int g = 42; // OK: 컴파일 타임에 초기화
constinit int h = foo(); // foo가 constexpr이면 OK, 아니면 에러
constinit
은constexpr
과는 달리 const가 아님 (값은 바뀔 수 있음)
constinit int counter = 0;
counter++; // OK
5. constexpr
함수와 가상함수
- 가상함수 자체는
constexpr
선언 가능 - 하지만 런타임 다형성(가상 디스패치)이 필요한 경우 constexpr 사용 불가
- 정적으로 호출되는 가상 함수는
constexpr
로 평가 가능
struct Base {
virtual constexpr int value() const { return 1; }
};
struct Derived : Base {
constexpr int value() const override { return 2; }
};
- 포인터를 통해 호출하면 런타임 바인딩 →
constexpr
평가 불가