C++
static_assert
수색…
통사론
- static_assert ( bool_constexpr , message )
- static_assert ( bool_constexpr ) / * C ++ 이후 * 17 * /
매개 변수
매개 변수 | 세부 |
---|---|
bool_constexpr | 확인할 식 |
메시지 | bool_constexpr 이 false 일 때 인쇄 할 메시지 |
비고
런타임 어설 션 과 달리 정적 어설 션은 컴파일 타임에 검사되며 최적화 된 빌드를 컴파일 할 때 적용됩니다.
static_assert
어설 션은 조건을 검사해야하며 거짓이라면 오류입니다. static_assert()
에서는 컴파일 타임에 완료됩니다.
template<typename T>
T mul10(const T t)
{
static_assert( std::is_integral<T>::value, "mul10() only works for integral types" );
return (t << 3) + (t << 1);
}
static_assert()
에는 필수 첫 번째 매개 변수 인 bool constexpr 인 조건이 있습니다. 문자열 리터럴 인 두 번째 매개 변수 인 메시지 가있을 수 있습니다. C ++ 17에서 두 번째 매개 변수는 선택적입니다. 그 전에는 필수적입니다.
C ++ 17
template<typename T>
T mul10(const T t)
{
static_assert(std::is_integral<T>::value);
return (t << 3) + (t << 1);
}
다음과 같은 경우에 사용됩니다.
- 일반적으로 constexpr 값의 일부 유형에는 컴파일시 확인이 필요합니다
- 템플릿 함수는 전달 된 유형의 특정 속성을 확인해야합니다.
- 다음과 같은 테스트 사례를 작성하려고합니다.
- 템플릿 메타 함수
- constexpr 함수
- 매크로 메타 프로그래밍
- 특정 정의가 필요함 (예 : C ++ 버전)
- 레거시 코드 포팅,
sizeof(T)
에 대한 어설 션 (예 : 32 비트 int) - 프로그램이 작동하려면 특정 컴파일러 기능이 필요합니다 (패킹, 빈 기본 클래스 최적화 등)
static_assert()
는 SFINAE에 참여하지 않으므로 추가 오버로드 / 특수화가 가능하면 템플릿 메타 프로그래밍 기법 (예 std::enable_if<>
) 대신 사용해야합니다. 예상되는 과부하 / 전문화가 이미 발견되었지만 추가 검증이 필요한 경우 템플릿 코드에서 사용할 수 있습니다. 이러한 경우 SFINAE에 의존하는 것보다 더 구체적인 오류 메시지를 제공 할 수 있습니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow