>  기사  >  백엔드 개발  >  유형이 아닌 템플릿 매개변수가 있는 `static_assert`가 GCC와 Clang에서 다르게 동작하는 이유는 무엇입니까?

유형이 아닌 템플릿 매개변수가 있는 `static_assert`가 GCC와 Clang에서 다르게 동작하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-05 01:01:02944검색

Why Does `static_assert` with Non-Type Template Parameters Behave Differently in GCC and Clang?

비형 템플릿 매개변수를 사용한 정적 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>

GCC와 Clang을 사용하여 컴파일하면 다른 결과가 생성됩니다. GCC에서는 Hitchhiker를 42 이외의 매개변수로 인스턴스화할 때만 Assertion 오류가 발생합니다. Clang에서는 템플릿이 인스턴스화되지 않은 경우에도 Assertion 오류가 발생합니다.

Assertion을 다음과 같이 수정합니다.

<code class="cpp">template <int answer>
struct Hitchhiker {
  static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer");
};

template <>
struct Hitchhiker<42> {};</code>

두 컴파일러 간에 일관된 동작이 발생하며 어설션은 템플릿 중에만 확인됩니다. 인스턴스화.

답변:

C 표준([temp.res]/8)에 따르면 유효한 특수화가 없는 인스턴스화되지 않은 템플릿은 형식이 잘못된 것으로 간주됩니다. 요구사항 없이 Diagnostic.

결론:

원래 코드의 경우 GCC는 인스턴스화되지 않은 템플릿에 대해 진단을 발행하지 않기로 결정했습니다. 반면에 Clang은 표준에서 요구하지 않는 진단을 내보내기로 결정합니다. 템플릿이 실제로 인스턴스화될 때만 어설션이 확인되므로 수정된 코드의 동작은 컴파일러 간에 더 일관됩니다.

이 시나리오에서 진단의 유무는 오류를 나타내지 않는다는 점에 유의하는 것이 중요합니다. 코드에서. 인스턴스화되지 않은 템플릿은 본질적으로 잘못된 형식이므로 유효하지 않은 특수화로 인스턴스화하려고 하면 컴파일 오류가 발생합니다.

위 내용은 유형이 아닌 템플릿 매개변수가 있는 `static_assert`가 GCC와 Clang에서 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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