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, 아니면 에러
  
  • constinitconstexpr과는 달리 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 평가 불가