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_assert는 constant-expression이 true이면 아무 일도 하지 않고, 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부터 메시지 없이도 쓸 수 있어요).
- 템플릿 안에서 쓰면 인스턴스화될 때마다 검사돼요.