ProgramingTip

재현, rvalue 참조, const 참조 경기 해결

bestdevel 2020. 12. 27. 19:41
반응형

재현, 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있습니까? 참조는 이니셜 라이저에 바인딩해야하지만 개체 유형은 그렇게 제한되지 않습니다. 사이에 과부하 그래서 TT &&효과적으로 의미 할 수 있었다 "나는 소유 주어진 한 경우, 그렇지 않은 복사본을 만들고, 기존 개체를 사용합니다." (이것은 순수한 패스에 의한 값과 유사하지만, 이동의 오버 헤드를 절약 할 수 있습니다.) 따라서 컴파일러는 현재 작업으로,이 기능에 의해 수행되어야 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 미래 제안에 게시하는 것은 어떨까요 ? 그래서 주관적인 토론 / 의견에 적합하지 않습니다.

참조 URL : https://stackoverflow.com/questions/17961719/overload-resolution-between-object-rvalue-reference-const-reference

반응형