다음 템플릿 함수를 고려하세요.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!