>백엔드 개발 >C++ >컴파일러에서 `static_assert`가 비유형 템플릿 매개변수와 다르게 동작하는 이유는 무엇입니까?

컴파일러에서 `static_assert`가 비유형 템플릿 매개변수와 다르게 동작하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-05 09:02:021001검색

Why Does `static_assert` Behave Differently with Non-Type Template Parameters Across Compilers?

컴파일러 간 비유형 템플릿 매개변수를 사용한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.