재현, rvalue 참조, const 참조 경기 해결
세 가지 함수가 모두 주어지면이 호출은 모호합니다.
int f( int );
int f( int && );
int f( int const & );
int q = f( 3 );
제거 f( int )
하면 Clang과 GCC가 모두 lvalue 참조보다 rvalue 참조를 선호합니다. 그러나 대신 참조 오버로드를 제거하면 f( int )
.
일반적으로 엄격한 부분 순서로 수행되는 int
것과 동일하지 않습니다. 여기서 규칙은 무엇입니까? 이것에 대한 결함 보고서를 회상하는 것입니다.
미래 표준에서 int &&
선호 될 가능성 이 int
있습니까? 참조는 이니셜 라이저에 바인딩해야하지만 개체 유형은 그렇게 제한되지 않습니다. 사이에 과부하 그래서 T
와 T &&
효과적으로 의미 할 수 있었다 "나는 소유 주어진 한 경우, 그렇지 않은 복사본을 만들고, 기존 개체를 사용합니다." (이것은 순수한 패스에 의한 값과 유사하지만, 이동의 오버 헤드를 절약 할 수 있습니다.) 따라서 컴파일러는 현재 작업으로,이 기능에 의해 수행되어야 T const &
하고 T &&
, 명시 적으로 복사합니다. 그러나 나는 그것이 엄격하게 표준인지 확신하지 못합니다.
여기서 규칙은 무엇입니까?
하나의 매개 변수가있는 것처럼, 해당 매개은 규칙 변수의 세 가지 가능한 파라미터 초기화 중 하나가 될 수 있어야한다는을 구석으로입니다 더 나은 경기 보다 모두 다른 두. 두 초기화를 비교하면 둘 중 하나가 다른 것보다 낫거나 둘 다 좋지 않습니다.
직접 참조 바인딩에 대한 특별한 규칙이 언급 된 세 가지 초기화 (세 가지 비교 모두에서) 구별 할 수 없습니다.
특수 메이크업 바인딩 직접 참조에 대한 규칙보다 int&&
더 잘 const int&
하지만, 어느 좋든 나쁘보다 int
. 따라서 최상의 일치는 없습니다.
S1 S2
int int&& indistinguishable
int const int& indistinguishable
int&& const int& S1 better
int&&
const int&
13.3.3.2보다 낫습니다 .
S1과 S2는 참조 바인딩 (8.5.3)이며 어느 쪽도 ref 한정자없이 선언 된 비 정적 멤버 함수의 암시 적 개체 매개 변수를 참조하지 않습니다 S1은 rvalue 참조를 rvalue에 바인딩하고 S2는 lvalue 참조에 바인딩합니다 .
그러나이 규칙은 초기화 중 하나가 참조 바인딩이 아닌 경우에는 적용되지 않습니다.
미래 표준에서 int &&가 int보다 선호 될 가능성이 있습니까? 참조는 이니셜 라이저에 바인딩해야하지만 개체 유형은 그렇게 제한되지 않습니다. 따라서 T와 T && 사이의 오버로드는 "소유권이 부여 된 경우 기존 개체를 사용하고 라이선스 복제를 만듭니다"를 의미 할 수 있습니다.
참조 바인딩이 비 참조 바인딩보다 더 잘 일치하도록 제안합니다. 당신의 아이디어를 isocpp 미래 제안에 게시하는 것은 어떨까요 ? 그래서 주관적인 토론 / 의견에 적합하지 않습니다.
'ProgramingTip' 카테고리의 다른 글
Slack에서 하이퍼 링크 만들기 (0) | 2020.12.27 |
---|---|
다중 블루투스 연결 (0) | 2020.12.27 |
단위 테스트 실행을위한 Python 패키지 구조, setup.py (0) | 2020.12.27 |
Linux에서 iOS 에뮬레이트 / 시뮬레이트 (0) | 2020.12.27 |
GetHashCode를 구현합니다 (0) | 2020.12.27 |