제공된 코드에서 function 함수는 정수 매개변수를 허용하도록 선언됩니다. 그러나 암시적 캐스팅으로 인해 실수로 문자, 부울 및 long 값도 허용합니다. 이러한 바람직하지 않은 동작을 방지하기 위해 우리는 엄격한 유형 일치를 적용하고 암시적 변환을 금지하는 방법을 모색합니다.
암시적 변환을 방지하는 한 가지 접근 방식은 함수 템플릿을 정의하는 것입니다. 원하는 유형을 제외한 모든 유형과 일치합니다. 예를 들어, 다른 유형에 대한 템플릿을 생성하고 삭제된 것으로 표시하여 컴파일을 효과적으로 금지할 수 있습니다.
void function(int); // this will be selected for int only template<class T> void function(T) = delete; // C++11
이런 방식으로 직접 일치하는 비템플릿 함수(이 경우 void 함수) (int)는 정수에 대해 항상 선택됩니다. 다른 유형으로 함수를 호출하려고 하면 삭제된 템플릿으로 인해 오류가 발생합니다.
C 11 이전에는 다른 방법이 필요했습니다. 암시적 변환 없이 유형 엄격한 함수 호출을 달성합니다. 여기에는 DeleteOverload 클래스를 생성하고 이를 사용하여 원하지 않는 유형에 대한 오버로드 선택을 비활성화하는 작업이 포함되었습니다.
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template<class T> void function(T a, DeleteOverload = 0); void function(int a) {}
C 23은 보다 사용자 친화적인 static_assert(false, msg)를 사용하여 접근합니다. 이를 통해 유형 불일치 시 더 명확한 오류 메시지를 표시할 수 있습니다.
void function(int) {} // this will be selected for int only template<class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); } int main() { function(1); // function(1l); // ^^^^^^^^^^^^ produces error: // error: static assertion failed: function shall be called for int only }
이러한 기술을 사용하면 비구성 함수에서 암시적 변환을 방지하여 더 엄격한 유형 검사를 보장하고 잠재적인 오류를 제거할 수 있습니다. 의도하지 않은 유형 불일치로 인해 발생했습니다.
위 내용은 비구성 C 함수에서 암시적 유형 변환을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!