C++20 consteval — 즉시 함수(Immediate Function)
consteval은 C++20에서 도입된 즉시 함수(immediate function) 선언 키워드입니다. constexpr 함수는 런타임에도 호출될 수 있지만, consteval 함수는 반드시 컴파일 타임에만 호출됩니다. 런타임 호출 시도는 컴파일 오류가 됩니다.
1. constexpr vs consteval 비교
섹션 제목: “1. constexpr vs consteval 비교”#include <cstdint>
// constexpr: 런타임·컴파일 타임 모두 가능constexpr int square_cx(int x) { return x * x; }
// consteval: 컴파일 타임 전용consteval int square_ce(int x) { return x * x; }
int main() { constexpr int a = square_cx(5); // OK — 컴파일 타임 int b = square_cx(5); // OK — 런타임도 가능
constexpr int c = square_ce(5); // OK — 컴파일 타임 // int d = square_ce(5); // ERROR: 런타임 호출 불가}2. 기본 활용: 컴파일 타임 테이블 생성
섹션 제목: “2. 기본 활용: 컴파일 타임 테이블 생성”#include <array>#include <cstddef>
consteval std::array<int, 10> make_squares() { std::array<int, 10> arr{}; for (std::size_t i = 0; i < 10; ++i) arr[i] = static_cast<int>(i * i); return arr;}
// 바이너리에 상수 배열이 직접 삽입됨inline constexpr auto squares = make_squares();3. consteval if — 조건부 컴파일 타임 분기
섹션 제목: “3. consteval if — 조건부 컴파일 타임 분기”C++23에서 도입된 if consteval을 사용하면 함수 내에서 컴파일 타임 여부를 분기할 수 있습니다.
#include <cmath>
constexpr double my_sqrt(double x) { if consteval { // 컴파일 타임 경로 (단순 뉴턴법) double r = x; for (int i = 0; i < 64; ++i) r = (r + x / r) / 2.0; return r; } else { // 런타임 경로 (하드웨어 sqrt 사용) return std::sqrt(x); }}4. 정책 검증에 활용
섹션 제목: “4. 정책 검증에 활용”consteval void validate_buffer_size(std::size_t size) { if (size == 0 || (size & (size - 1)) != 0) throw "Buffer size must be a non-zero power of 2";}
template<std::size_t N>struct Buffer { consteval Buffer() { validate_buffer_size(N); } int data[N];};
// Buffer<128> ok; // OK// Buffer<100> err; // 컴파일 오류: "Buffer size must be a non-zero power of 2"5. consteval 생성자
섹션 제목: “5. consteval 생성자”struct Color { uint8_t r, g, b, a;
consteval Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) : r(r), g(g), b(b), a(a) {}};
// 모든 Color 리터럴은 컴파일 타임에 검증됨constexpr Color red = Color(255, 0, 0);constexpr Color white = Color(255, 255, 255);6. 주요 제약 사항
섹션 제목: “6. 주요 제약 사항”| 항목 | 내용 |
|---|---|
| 런타임 호출 | 항상 컴파일 오류 |
| 가상 함수 | consteval virtual 불가 |
| 함수 포인터 | consteval 함수를 가리키는 함수 포인터 생성 불가 |
| 예외 던지기 | 컴파일 타임 오류 메시지로 활용 가능 |
consteval은 컴파일 타임 계산이 반드시 보장되어야 하는 상황에 사용합니다. 상수 테이블 생성, 입력 검증 강제, 설정 값 정책 확인 등에서 constexpr보다 강력한 안전망을 제공합니다.