왜 Rvalue 참조 변수가 Rvalue가 아닌가?
두 개의 오버로드된 함수 f:
void f(T&&); // Overload #1 void f(T&); // Overload #2
Within을 고려해 보겠습니다. 함수 g:
void g(T&& t) { f(t); // Calls Overload #2 }
놀랍게도 과부하 #2는 rvalue 참조 서명(T&&)이 있는 첫 번째 오버로드에도 불구하고 t가 lvalue로 간주되므로 호출됩니다.
어떻게 rvalue 참조 서명이 rvalue를 전달하는 호출과 일치하지 않을 수 있습니까?
Rvalue에 대한 C 규칙 이해
Rvalue는 일반적으로 이름이 없는 변수입니다. 곧 이름을 잃게 됩니다. 티& t에는 식별자 t가 있으므로 lvalue입니다. rvalue는 수명이 짧아 나중에 참조할 수 없기 때문에 이는 의미가 있습니다.
그러나 T&&는 rvalue 참조 유형입니다. 정적 형변환을 포함하지 않고 rvalue에만 바인딩할 수 있지만 여전히 rvalue 참조 유형의 lvalue입니다. rvalue 참조 특성은 초기화 및 decltype 사용 중에만 중요합니다. 그렇지 않으면 참조 유형의 lvalue로 작동합니다.
정적 형변환 및 참조 확장
std::move(t)는 정적 형변환을 수행하여 rvalue 참조를 반환합니다. t에. 이를 통해 임시 값이 생성자 외부의 참조에 바인딩될 때 참조 수명 연장을 가질 수 있습니다.
C 표준은 이러한 시나리오를 처리하기 위한 명시적인 규칙을 정의합니다. Rvalue 참조 및 const 참조는 rvalue에 바인딩될 수 있습니다. 함수에서 명명된 값을 반환할 때, 값에 이름이 없을 때, 함수가 명시적으로 rvalue 참조를 반환할 때 암시적 이동이 발생합니다.
또한 T&&가 항상 rvalue 참조가 아닐 수도 있습니다. T가 X& 또는 X const&, 참조 축소는 T&& X& 또는 X const& 마지막으로 T&&&는 인수 유형에 따라 유형 추론에서 "전달 참조" 역할을 할 수 있습니다.
위 내용은 Rvalue 참조 변수가 Rvalue 참조 함수 서명과 일치하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!