> 백엔드 개발 > C++ > C 오버로드 확인은 값, Rvalue 참조 및 Const Lvalue 참조 매개 변수를 어떻게 처리합니까?

C 오버로드 확인은 값, Rvalue 참조 및 Const Lvalue 참조 매개 변수를 어떻게 처리합니까?

DDD
풀어 주다: 2024-12-01 09:40:12
원래의
326명이 탐색했습니다.

How Does C   Overload Resolution Handle Value, Rvalue Reference, and Const Lvalue Reference Parameters?

오버로드 해결: Value, Rvalue 참조 및 Const Lvalue 참조

오버로드 해결에서는 여러 호출이 있을 때 모호한 호출이 발생하는 것이 일반적입니다. 실행 가능한 함수는 동일한 매개변수 유형을 공유합니다. 값, rvalue 참조 및 const lvalue 참조 사이에 오버로드가 발생할 때 특히 흥미로운 경우가 발생합니다.

모호성과 해결 방법

주어진 함수:

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

호출 int q = f( 3 ); 모호해진다. Clang과 GCC는 f( int )가 제거될 때 lvalue 참조보다 rvalue 참조를 선호합니다. 그러나 참조 오버로드 중 하나를 제거하면 f( int )의 모호성이 발생합니다.

오버로드 해결 규칙

오버로드 해결은 참조 오버로드에 대한 고유한 "더 나은 일치"를 찾는 것을 기반으로 합니다. 매개변수. 특별한 규칙이 없으면 세 가지 초기화(value, rvalue 참조 및 const lvalue 참조)는 모두 구별되지 않습니다.

그러나 rvalue 참조는 rvalue에 바인딩되고 const lvalue 참조는 그렇지 않기 때문에 rvalue 참조는 13.3.3.2의 다음 규칙으로 인해 더 나은 일치로 간주됩니다.

S1 binds an rvalue reference to an rvalue and S2 binds an lvalue reference.
로그인 후 복사

이 규칙은 적용되지 않습니다. 하나의 초기화가 참조 바인딩이 아닌 경우.

향후 표준을 위한 제안

저자는 미래 표준에서는 int보다 int &&를 선호해야 한다고 제안합니다. 제한되지 않은 객체 유형과 달리 이니셜라이저에 대한 초기화 바인딩입니다. 이는 이동에 따른 오버헤드를 피하면서 순수 값별 전달의 대안이 될 수 있습니다.

위 내용은 C 오버로드 확인은 값, Rvalue 참조 및 Const Lvalue 참조 매개 변수를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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