static_assert — static_assert 선언

static_assert — static_assert 선언

static_assert는 컴파일 타임에 조건을 검사해, 참이 아니면 컴파일을 실패시키는 선언이에요.

컴파일 타임 불변식을 검증할 때 사용해요. 예를 들어 타입 크기, 타입 특성, 상수 표현식의 값을 확인해서, 조건이 거짓이면 컴파일러 오류 메시지를 내요. 런타임 오류 대신 컴파일 타임에 문제를 잡아주므로 안전해요.

출처: cppreference

본문

static_assert 선언은 컴파일 타임 검사를 수행해요.

문법 (Syntax)

static_assert( constant-expression , string-literal ) ;
static_assert( constant-expression ) ;
  • constant-expression — 컴파일 타임에 평가되는 상수 표현식. false(즉 false로 문맥 변환됨)면 컴파일이 실패해요.
  • string-literal — (선택) 컴파일 실패 시 표시할 진단 메시지

설명 (Explanation)

static_assertconstant-expressiontrue이면 아무 일도 하지 않고, false이면 컴파일 시간 오류를 일으켜요. 이는 #error와 비슷하지만 타입·상수 표현식 기반이라 훨씬 유연해요.

static_assert(sizeof(int) >= 4, "int must be at least 4 bytes");
static_assert(std::is_integral_v<T>, "T must be an integral type");

용도

  • 플랫폼/컴파일러 가정 검증 (sizeof, alignof 등)
  • 타입 특성 검증 (std::is_* trait)
  • 템플릿 메타프로그래밍에서 불변식 검사
  • 컨테이너가 비어 있지 않음 같은 추상 불변식

예제 (Example)

static_assert(sizeof(char) == 1, "char is 1 byte");
static_assert(alignof(double) <= alignof(long double));

template <typename T>
void func()
{
    static_assert(std::is_arithmetic_v<T>, "requires arithmetic type");
}

컴파일 타임에만 수행되고 런타임 비용이 전혀 없어요. 조건이 만족되면 컴파일된 코드에서 사라져요.

노트 (Notes)

  • static_assert는 실행 코드가 아니라 선언이므로, 런타임에 아무 영향도 주지 않아요.
  • 메시지 문자열은 선택 사항이지만, 넣으면 디버깅에 도움이 돼요 (C++17부터 메시지 없이도 쓸 수 있어요).
  • 템플릿 안에서 쓰면 인스턴스화될 때마다 검사돼요.

더 알아보기 (Learn more)

cppreference