최대 1 분 소요

개요

기존에는 assert()를 이용하여 런타임 진단만 가능했는데요(assert() 참고),

C++11 부터는 static_assert()를 이용하여 컴파일 타임 진단이 가능합니다.

런타임 진단은 해당 코드가 실행되어야 진단이 가능하여 커버리지가 낮을 수 있지만, 컴파일 타임 진단은 컴파일 과정에서 이루어 지므로 100% 진단이 이루어집니다.

특히 컴파일 타임 프로그래밍이나 템플릿 메타 프로그래밍 시에 인자의 타입을 코딩 계약으로 표현하기 힘든 경우, type_traits를 사용하여 진단할때 유용합니다.(타입 특성(type_traits) 참고)

1
2
3
4
5
6
7
8
9
// T는 포인터 타입만 전달되어야 합니다.
template<typename T>
void Func_11(T t) { 
    static_assert(std::is_pointer<T>::value, "only pointer"); // is_pointer는 C++11에 추가된 type_traits
}

int a{20};
Func_11(&a); // (O) 포인터여서 문제없습니다.
Func_11(a); // (X) 컴파일 오류. error: static assertion failed: only pointer

(C++17~) static_assert()의 메시지 생략

기존에는 static_assert() 사용시 항상 메시지를 작성해야 했으나, C++17 부터는 static_assert()의 메시지를 생략해도 됩니다.

1
2
3
4
5
6
template<typename T>
void Func_17(T t) { 
    static_assert(std::is_pointer<T>::value); 
}
int a{20};
Func_17(a); // (X) 컴파일 오류. error: static assertion failed

태그:

카테고리:

업데이트:

댓글남기기