컴파일러 간 비유형 템플릿 매개변수를 사용한 static_assert의 일관되지 않은 동작
C에서는 static_assert를 사용하여 컴파일 타임에 조건을 확인할 수 있습니다. . 그러나 최근 관찰에 따르면 다양한 컴파일러에서 비유형 템플릿 매개변수와 함께 사용될 때 static_assert의 동작에 차이가 있는 것으로 나타났습니다.
구체적으로 다음 코드 조각은 다음과 같습니다.
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
static_assert를 사용하여 일반 템플릿 인스턴스화를 비활성화하려고 하면 Clang 및 GCC에서 다르게 동작합니다. Clang은 템플릿이 인스턴스화되지 않은 경우에도 어설션 오류를 발생시키는 반면, GCC는 42가 아닌 매개변수 값으로 인스턴스화할 때만 오류를 발생시킵니다.
불일치를 이해하기 위해 C 표준의 관련 섹션( [temp.res]/8):
If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
이 규칙에 따르면 기본 템플릿인 Hitchhiker는 잘못된 형식입니다. 유효한 전문화를 생성할 수 없습니다. 따라서 진단을 발행할 필요가 없습니다. 그러나 Clang은 요구 사항이 부족함에도 불구하고 진단 제공을 선택합니다.
인스턴스화를 42개로만 제한하려는 경우 권장되는 접근 방식은 다음과 같이 일반 템플릿 정의를 생략하는 것입니다.
<code class="cpp">template <> struct Hitchhiker<42> {};</code>
위 내용은 컴파일러에서 `static_assert`가 비유형 템플릿 매개변수와 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!