>백엔드 개발 >C++ >C 오버로드 해결 모호성은 언제 Value, Rvalue 참조 및 Const Lvalue 참조 매개변수 사이에 발생합니까?

C 오버로드 해결 모호성은 언제 Value, Rvalue 참조 및 Const Lvalue 참조 매개변수 사이에 발생합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-28 11:16:13744검색

When Do C   Overload Resolution Ambiguities Arise Between Value, Rvalue Reference, and Const Lvalue Reference Parameters?

오버로드 해결 모호함: 값, Rvalue 참조 및 Const Lvalue 참조

다양한 매개변수 유형(value, rvalue 참조, const lvalue 참조)을 갖는 세 가지 오버로드된 함수가 제공됩니다. 세 가지 오버로드가 모두 실행 가능한 경우 함수 호출이 모호해질 수 있습니다. 이 기사에서는 이러한 시나리오에서 오버로드 해결을 관리하는 규칙에 대해 논의하고 C에서 관찰되는 미묘한 동작을 탐색합니다.

규칙

고려해야 할 매개변수가 하나만 있는 규칙에서는 하나의 매개변수 초기화가 반드시 수행되어야 한다고 명시합니다. 다른 두 둘 다보다 더 나은 일치입니다. 두 초기화를 비교할 때 둘 중 하나가 더 나은 것으로 간주되거나 둘 다 더 나은 것으로 간주되지 않습니다(구분 불가능).

직접 참조 바인딩에 대한 특별한 규칙이 없으면 세 가지 비교 모두에서 세 초기화를 구별할 수 없습니다. 그러나 이러한 특수 규칙은 int&&(rvalue 참조)를 const int&(lvalue 참조)보다 높이며, 어느 쪽도 int(값)보다 더 좋거나 나쁘다고 간주되지 않습니다. 따라서 최상의 일치 항목이 발생하지 않습니다.

비교 행렬

이 동작은 다음 행렬에 설명되어 있습니다.

S1    S2
int   int&&         indistinguishable
int   const int&    indistinguishable
int&& const int&    S1 better

행렬은 int&&가 const int&보다 선호됨을 보여줍니다. C 표준의 13.3.3.2절을 기반으로 합니다. 이 규칙은 참조 한정자 없이 비정적 멤버 함수의 암시적 개체 매개 변수를 참조하지 않는 참조 바인딩에 적용되며 S1은 rvalue 참조를 rvalue에 바인딩하고 S2는 lvalue 참조를 바인딩합니다.

그러나 초기화 중 하나가 참조 바인딩이 아니어서 모호한 경우에는 이 규칙이 적용되지 않습니다.

미래 방향

저자는 int&&(rvalue 참조)를 int(값)보다 더 나은 일치로 고려할 것을 제안합니다. 참조는 초기화 프로그램에 바인딩되어야 하고 객체 유형은 그러한 제약 조건을 따르지 않기 때문입니다. 이는 잠재적으로 초기화 프로그램의 바인딩을 우선시하는 새로운 오버로드 해결 규칙을 생성할 수 있습니다. 그러나 이 제안은 isocpp 미래 제안 플랫폼을 통한 추가 논의와 잠재적인 표준화가 필요합니다.

위 내용은 C 오버로드 해결 모호성은 언제 Value, Rvalue 참조 및 Const Lvalue 참조 매개변수 사이에 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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