Value, Rvalue 참조, Const Lvalue 참조 간의 오버로드 해결
다음 함수 오버로드를 고려하세요.
int f( int ); int f( int && ); int f( int const & );
호출 int q = f( 3 ); 인수에 대해 세 가지 오버로드가 모두 실행 가능하기 때문에 모호합니다. 오버로드 해결 규칙에는 다른 두 매개변수 초기화보다 나은 하나의 매개변수 초기화가 있어야 한다고 명시되어 있습니다.
이 경우 매개변수 초기화는 다음과 같습니다.
그러나 이러한 초기화 중 어느 것도 다른 두 가지보다 낫지 않습니다. 따라서 호출이 모호합니다.
f( int )를 제거하면 Clang과 GCC가 lvalue 참조(int const&)보다 rvalue 참조(int&&)를 선호하게 됩니다. 이는 rvalue 참조가 rvalue 3에 바인딩될 수 있지만 lvalue 참조는 바인딩될 수 없기 때문입니다. 참조 오버로드 중 하나를 제거하면 f( int )의 모호성이 발생합니다.
이 동작은 int가 int&& 및 int const&와 동일하다는 사실에 기인합니다. 그러나 int&&와 int const&는 서로 동일하지 않습니다. 둘 중 하나를 선택하는 규칙은 둘 다 참조 바인딩이고 int&&가 rvalue에 바인딩되고 int const&가 lvalue에 바인딩될 때 int&&가 int const&보다 낫다는 것입니다.
이 규칙은 초기화 중 하나가 다음인 경우에는 적용되지 않습니다. 참조 바인딩이 아닙니다. 따라서 int는 int&& 및 int const&와 구별할 수 없습니다.
향후 표준에서 int&&가 int보다 선호될 가능성은 없습니다. 제안된 규칙은 참조 바인딩을 비참조 바인딩보다 더 잘 일치하게 만들 것이며, 이는 오버로드 해결을 위한 기존 규칙에 위배됩니다.
위 내용은 C 오버로드 해결은 `int`, `int&&` 및 `const int&`를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!