> 백엔드 개발 > C++ > C 오버로드 해결은 `int`, `int&&` 및 `const int&`를 어떻게 처리합니까?

C 오버로드 해결은 `int`, `int&&` 및 `const int&`를 어떻게 처리합니까?

Patricia Arquette
풀어 주다: 2024-11-20 19:58:16
원래의
338명이 탐색했습니다.

How Does C   Overload Resolution Handle `int`, `int&&`, and `const int&`?

Value, Rvalue 참조, Const Lvalue 참조 간의 오버로드 해결

다음 함수 오버로드를 고려하세요.

int f( int );
int f( int && );
int f( int const & );
로그인 후 복사

호출 int q = f( 3 ); 인수에 대해 세 가지 오버로드가 모두 실행 가능하기 때문에 모호합니다. 오버로드 해결 규칙에는 다른 두 매개변수 초기화보다 나은 하나의 매개변수 초기화가 있어야 한다고 명시되어 있습니다.

이 경우 매개변수 초기화는 다음과 같습니다.

  • int from 3
  • int&& from 3
  • int const& from 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿