static_assert

컴파일 시 소프트웨어 어설션을 테스트합니다. 지정된 상수 식이 false있으면 컴파일러가 지정된 메시지를 표시하고, 제공된 경우 컴파일이 오류 C2338로 실패하고, 그렇지 않으면 선언이 적용되지 않습니다.

구문

static_assert( constant-expression, string-literal );

static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)

매개 변수

constant-expression
부울로 변환할 수 있는 정수 계열 상수 식입니다. 계산된 식이 0(false) 이면 문자열 리터럴 매개 변수가 표시되고 컴파일에 오류가 발생합니다. 식이 0이 아닌 경우(true) static_assert 선언은 적용되지 않습니다.

string-literal
상수 식 매개 변수가 0이면 표시되는 메시지입니다. 메시지는 컴파일러의 기본 문자 집합에 있는 문자 문자열입니다. 즉, 멀티바이트 또는 와이드 문자가 아닙니다.

설명

선언의 static_assert 상수 식 매개 변수는 소프트웨어 어설션나타냅니다. 소프트웨어 어설션은 프로그램의 특정 지점에서 true가 될 조건을 지정합니다. 조건이 true이면 선언에 static_assert 영향을 주지 않습니다. 조건이 false이면 어설션이 실패하고, 컴파일러가 메시지를 문자열 리터럴 매개 변수로 표시하고, 오류와 함께 컴파일이 실패합니다. Visual Studio 2017 이상에서는 문자열 리터럴 매개 변수가 선택 사항입니다.

이 선언은 static_assert 컴파일 시간에 소프트웨어 어설션을 테스트합니다. 반면, 어설션 매크로 및 _assert 및 _wassert 함수는 런타임에 소프트웨어 어설션을 테스트하고 공간 또는 시간에 런타임 비용이 발생합니다. 템플릿 인수를 static_assert 상수 식 매개 변수에 포함할 수 있으므로 이 선언은 템플릿을 디버깅하는 데 특히 유용합니다.

컴파일러는 선언이 static_assert 발견될 때 구문 오류에 대한 선언을 검사합니다. 컴파일러는 템플릿 매개 변수에 의존하지 않는 경우 상수 식 매개 변수를 즉시 평가합니다. 그렇지 않으면 템플릿이 인스턴스화될 때 컴파일러가 상수 식 매개 변수를 평가합니다. 그 결과, 컴파일러는 선언이 발생할 때 진단 메시지를 한 번 내보내고 템플릿이 인스턴스화될 때 다시 한 번 메시지를 내보낼 수 있습니다.

네임스페이 static_assert 스, 클래스 또는 블록 범위에서 키워드(keyword) 사용할 수 있습니다. (다음 static_assert 항목 키워드(keyword) 네임스페이스 범위에서 사용할 수 있으므로 프로그램에 새 이름을 도입하지 않더라도 기술적으로 선언입니다.)

네임스페이스 범위에 대한 static_assert 설명

다음 예제에서는 선언에 static_assert 네임스페이스 범위가 있습니다. 컴파일러가 void * 형식의 크기를 알고 있기 때문에 식이 즉시 계산됩니다.

예: static_assert 네임스페이스 범위 사용

static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");

클래스 범위에 대한 static_assert 설명

다음 예제에서 선언에는 static_assert 클래스 범위가 있습니다. static_assert 템플릿 매개 변수가 POD(일반 이전 데이터) 형식인지 확인합니다. 컴파일러는 선언될 때 선언을 static_assert 검사하지만 클래스 템플릿이 인스턴스화main()될 때까지 상수 식 매개 변수를 basic_string 평가하지 않습니다.

예: static_assert 클래스 범위 사용

#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
    static_assert(std::is_pod<CharT>::value,
                  "Template argument CharT must be a POD type in class template basic_string");
    // ...
    };
}

struct NonPOD {
    NonPOD(const NonPOD &) {}
    virtual ~NonPOD() {}
};

int main()
{
    std::basic_string<char> bs;
}

블록 범위에 대한 static_assert 설명

다음 예제에서는 선언에 static_assert 블록 범위가 있습니다. VMPage static_assert 구조체의 크기가 시스템의 가상 메모리 페이지와 같은지 확인합니다.

예: static_assert 블록 범위

#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
    struct VMPage { // ...
           };
    int check_pagesize() {
    static_assert(sizeof(VMPage) == PAGESIZE,
        "Struct VMPage must be the same size as a system virtual memory page.");
    // ...
    }
// ...
};

참고 항목

어설션 및 사용자 제공 메시지(C++)
#error 지시문(C/C++)
assert Macro, _assert, _wassert
템플릿
ASCII 문자 집합
선언 및 정의