>백엔드 개발 >C++ >C에서 `int`, `int&&`, `const int&` 사이에서 오버로드 해결이 모호한 이유는 무엇입니까?

C에서 `int`, `int&&`, `const int&` 사이에서 오버로드 해결이 모호한 이유는 무엇입니까?

DDD
DDD원래의
2024-11-28 15:58:10783검색

Why is Overload Resolution Ambiguous Between `int`, `int&&`, and `const int&` in C  ?

값, Rvalue 참조 및 Const Lvalue 참조 오버로드가 있는 경우 오버로드 해결 모호함

C에서 함수 호출에 여러 실행 가능한 항목이 포함되는 경우 과부하가 있는 경우, 과부하 해결은 엄격한 부분 순서를 기반으로 가장 일치하는 항목을 결정합니다. 그러나 다음 코드에서 예시된 것처럼 특정 시나리오에서는 모호성이 발생합니다.

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );

이 호출은 모호하지만 f( int )를 제거하면 Clang과 GCC 모두 rvalue 참조 오버로드 f( int && )를 선호하게 됩니다. lvalue 참조 f( int const & )에 대해. 그러나 참조 오버로드 중 하나를 제거하면 f( int )가 모호해집니다.

오버로드 해결 규칙

오버로드 해결에서 함수 호출 내의 매개변수 초기화는 다음과 같아야 합니다. 다른 두 초기화보다 더 잘 일치합니다. 두 초기화를 비교할 때 하나가 더 좋거나, 구별할 수 없거나, 더 나쁠 수 있습니다. 주어진 시나리오에서 직접 참조 바인딩에 대한 특수 규칙은 int &&를 const int &보다 좋게 만들지 만 int보다 낫지도 나쁘지도 않습니다. 따라서 최적 일치는 존재하지 않습니다.

Rvalue 참조에 대한 특수 규칙

흥미롭게도 lvalue 참조보다 rvalue 참조를 선호하는 규칙은 두 초기화에 모두 참조 바인딩이 포함될 때만 적용됩니다. 그러나 int의 경우와 같이 하나의 초기화가 참조 바인딩이 아닌 경우에는 이 규칙이 적용되지 않습니다.

가능한 향후 확장

우선순위 제안 오버로드 해결에서 int && over int는 소유권 처리를 위한 보다 효율적인 메커니즘을 제공하는 것을 목표로 합니다. 이 접근 방식은 참조를 초기화 프로그램에 바인딩함으로써 객체가 소유되고 직접 조작될 수 있도록 보장하여 잠재적으로 복사 오버헤드를 제거합니다.

위 내용은 C에서 `int`, `int&&`, `const int&` 사이에서 오버로드 해결이 모호한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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