컴파일 타임 상수(constexpr)

MwG·2026년 3월 12일

C++

목록 보기
18/21

constexpr

이 키워드가 붙은 객체나 함수의 리턴 값을 컴파일 타임에 알 수 있다는 의미를 가짐


template<int N>
struct A
{
	int operator()() {return N;}
}

int main()
{
	constexpr int num = 3;
    int arr[num];
    
    constexpr int N = 10;
	A<N> a;
    std::cout << a();
    
    constexpr int val = 10;
    enum B { x = val ,y ,z}
}

어떠한 식이 상수식이라고 명시해주는 키워드

constexpr vs const

const로 정의된 상수들은 굳이 컴파일 타임에 그 값을 알 필요가 없음.

int a;
...
const int b = a;
int a;
...
constexpr int b = a; //컴파일 타임 시 a가 뭐가 올 지 모르기 때문에 오류 발생

constexpr 함수

제약조건

  1. goto 문 사용
  2. 예외 처리(trya문 C++ 20 부터 가능)
  3. 리터럴 타입이 아닌 변수의 정의
  4. 초기화 되지 않는 변수의 정의
  5. 실행 중간에 constexpr이 아닌 함수를 호출하게 됨

constexpr 생성자

constexpr함수에서 적용되는 제약이 동일하게 적용된다. 이 클래스는 다른 클래스를 가상 상속 받을 수 없다.

if constexpr

"컴파일 타임에 조건문을 평가해서 조건에 맞지 않는 코드 블록을 아예 삭제해버리는" 기능

일반 if와 무엇이 다른가요?

가장 큰 차이점은 컴파일 에러 발생 여부입니다.

일반 if: 조건이 false라도 그 안의 코드가 문법적으로 틀리면 무조건 컴파일 에러가 납니다.

if constexpr: 조건이 false인 블록은 컴파일러가 아예 무시(Discard)합니다. 따라서 그 안에 말도 안 되는 코드가 있어도(템플릿 타입과 맞지 않는 등) 컴파일 에러가 나지 않습니다.

template <typename T>
void show_value(T t)
{
	if constexpr (std::is_pointer<T>::value) 
	{
		std::cout << "포인터 이다 : " << *t << std::endl;
	}
	else
	{
		std::cout << "포인터가 아니다 : " << t << std::endl;
	}
}

int main()
{
	
	int x = 3;
	show_value(x);/*constexpr이 없을 경우 조건문 내 블럭을 검사하는데 
   이때 x가 int로 들어왔으므로 *t는 포인터가 아닌 것을 
   역참조 하려하기 때문에 오류가 발생한다. */

	int* p = &x;
	show_value(p);


	return 0;
}

0개의 댓글