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