>백엔드 개발 >C++ >호출되지 않은 템플릿 함수에서 정적 어설션이 실패하는 이유는 무엇입니까?

호출되지 않은 템플릿 함수에서 정적 어설션이 실패하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-12 07:58:011006검색

Why Does a Static Assertion Fail in an Uncalled Template Function?

호출되지 않은 템플릿 함수에도 불구하고 Static_Assert 실패

다음 템플릿 함수를 고려하세요.

template <typename T>
inline T getValue(AnObject&) {
    static_assert(false, "this function has to be implemented for desired type");
}

호출하지 않았음에도 불구하고 g 4.6.3으로 컴파일하는 경우 이 함수는 어디서든 다음 오류와 함께 컴파일이 실패합니다.

static_assertion failed "this function has to be implemented for the desired type"

함수가 호출되지 않고 컴파일 오류를 유발해서는 안 되기 때문에 이 동작은 의문을 제기할 수 있습니다. 그러나 [temp.res]/8의 C 표준에 따르면:

If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.

컴파일할 수 있는 유효한 특수화로 함수 템플릿을 인스턴스화할 수 있는 가능한 방법이 없으므로 템플릿 정의 자체가 고려됩니다. 형식이 잘못되었습니다. 이를 통해 인스턴스화가 발생하기 전에도 컴파일러가 이를 거부할 수 있습니다.

이 문제를 해결하고 지연된 오류 감지를 허용하려면 템플릿 함수를 다음과 같이 수정할 수 있습니다.

template <typename T>
struct foobar : std::false_type {
};

template <typename T>
inline T getValue(AnObject&) {
    static_assert(foobar<T>::value, "this function has to be implemented for desired type");
}

다음을 사용하여 추가 템플릿 struct foobar를 컴파일 타임 플래그로 사용하면 컴파일러는 함수 템플릿을 즉시 거부할 수 없습니다. 인스턴스화되면 foobar 의도한 대로 정적 어설션이 실패해야 하는지 여부를 결정합니다.

위 내용은 호출되지 않은 템플릿 함수에서 정적 어설션이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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