> 백엔드 개발 > C++ > Rvalue 참조 변수가 Rvalue 참조 함수 서명과 일치하지 않는 이유는 무엇입니까?

Rvalue 참조 변수가 Rvalue 참조 함수 서명과 일치하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-10 22:46:11
원래의
801명이 탐색했습니다.

Why Doesn't an Rvalue Reference Variable Match an Rvalue Reference Function Signature?

왜 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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