"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 컴파일러에서 `static_assert`가 비유형 템플릿 매개변수와 다르게 동작하는 이유는 무엇입니까?

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

2024-11-09에 게시됨
검색:444

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

컴파일러 간 비유형 템플릿 매개변수를 사용한 static_assert의 일관되지 않은 동작

C에서는 static_assert를 사용하여 컴파일 타임에 조건을 확인할 수 있습니다. . 그러나 최근 관찰에 따르면 다양한 컴파일러에서 비유형 템플릿 매개변수와 함께 사용될 때 static_assert의 동작에 차이가 있는 것으로 나타났습니다.

구체적으로 다음 코드 조각은 다음과 같습니다.

template 
struct Hitchhiker {
  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};

template 
struct Hitchhiker {};

는 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개로만 제한하려는 경우 권장되는 접근 방식은 다음과 같이 일반 템플릿 정의를 생략하는 것입니다.

template 
struct Hitchhiker {};
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3