다음을 통해 공유


인수 일치

현재 범위에서 함수 호출에 제공된 인수와 가장 일치하는 함수 선언에 대해 오버로드된 함수가 선택됩니다. 적절한 함수를 찾으면 함수가 호출됩니다. 이 컨텍스트에서 "적합하다"는 표현은 다음 중 하나를 의미합니다.

  • 정확히 일치하는 항목을 찾았습니다.

  • 간단한 변환을 수행했습니다.

  • 정수 계열 확장이 수행되었습니다.

  • 원하는 인수 형식에 대한 표준 변환이 존재합니다.

  • 원하는 인수 형식에 대한 사용자 정의 변환(변환 연산자 또는 생성자)이 존재합니다.

  • 줄임표로 나타낸 인수를 찾았습니다.

컴파일러가 각 인수의 후보 함수 집합을 만듭니다. 후보 함수는 해당 위치의 실제 인수를 형식 인수의 형식으로 변환할 수 있는 함수입니다.

"가장 일치하는 함수" 집합이 각 인수에 대해 빌드되고 모든 집합에 공통된 함수가 선택됩니다. 공통된 함수가 2개 이상일 경우 오버로드가 모호해지고 오류를 생성합니다. 최종적으로 선택되는 함수는 하나 이상의 인수에 대해 그룹의 다른 함수보다 일치합니다. 적합한 함수를 선택할 수 없는 경우 함수 호출에서 오류가 생성됩니다.

다음과 같은 선언이 있습니다. 알아보기 쉽게 함수가 Variant 1, Variant 2 및 Variant 3으로 표시되었습니다.

Fraction &Add( Fraction &f, long l );       // Variant 1
Fraction &Add( long l, Fraction &f );       // Variant 2
Fraction &Add( Fraction &f, Fraction &f );  // Variant 3

Fraction F1, F2;

다음과 같은 문이 있습니다.

F1 = Add( F2, 23 );

위의 문에서는 두 집합을 빌드합니다.

집합 1: 분수 형식의 첫 번째 인수가 있는 후보 함수

집합 2: 두 번째 인수를 int 형식으로 변환할 수 있는 후보 함수

변형 1

변형1(표준 변환을 사용하여 int를 long으로 변환할 수 있음)

변형 3

 

집합 2의 함수는 실제 매개 변수 형식에서 정식 매개 변수 형식으로 암시적 변환이 존재하는 함수이며 이 중에는 실제 매개 변수 형식을 정식 매개 변수 형식으로 변환하는 "cost"가 가장 작은 함수가 있습니다.

두 집합의 공통된 함수는 변형 1입니다. 다음은 모호한 함수 호출의 예입니다.

F1 = Add( 3, 6 );

앞의 함수 호출에서 다음 집합을 빌드합니다.

집합 1: int 형식의 첫 번째 인수가 있는 후보 함수

집합 2: int 형식의 두 번째 인수가 있는 후보 함수

변형 2(표준 변환을 사용하여 int를 long으로 변환할 수 있음)

변형1(표준 변환을 사용하여 int를 long으로 변환할 수 있음)

이 두 집합의 공통 영역이 비어 있습니다. 따라서 컴파일러가 오류 메시지를 생성합니다.

인수 일치의 경우 n개의 기본 인수를 가진 함수는 각각 인수의 개수가 다른 n+1개의 별도 함수로 처리됩니다.

줄임표(...)는 와일드카드로 사용되어 실제 인수와 일치합니다. 오버로드된 함수 집합을 설계할 때 주의하지 않으면 모호한 집합이 여러 개 생길 수 있습니다.

참고

함수 호출이 발생해야 오버로드된 함수의 모호성을 확인할 수 있습니다.이때 함수 호출의 각 인수에 대해 집합이 빌드되고 명확한 오버로드가 존재하는지 여부를 확인할 수 있습니다.즉, 특정 함수 호출에서 호출할 때까지 코드에 모호성이 남아있을 수 있습니다.

참고 항목

참조

오버로딩