>백엔드 개발 >C++ >Rvalue 참조 매개변수는 언제 C의 Lvalue 인수에 바인딩될 수 있습니까?

Rvalue 참조 매개변수는 언제 C의 Lvalue 인수에 바인딩될 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-07 21:48:18885검색

When Can an Rvalue Reference Parameter Bind to an Lvalue Argument in C  ?

Rvalue 참조 매개변수가 Lvalue 인수에 바인딩될 수 있는 이유

C에서 rvalue 참조는 rvalue에 바인딩될 것으로 예상됩니다. 그러나 rvalue 참조 매개변수가 lvalue 인수와 일치하는 경우가 있어 많은 프로그래머가 놀라는 경우가 있습니다.

다음 코드를 고려하세요.

void f(T&&); // #1
void f(T&);  // #2

일반적으로 f(T&&)를 기대합니다. rvalue를 전달할 때 호출되는 오버로드와 lvalue에 대한 f(T&) 오버로드입니다. 그러나 동작은 다릅니다.

void g(T&& t) 
{ 
  f(t);  // calls #2
}

이 예에서는 t가 rvalue임에도 불구하고 f(T&) 오버로드가 호출됩니다. 이는 rvalue 참조 유형에도 불구하고 t가 여전히 lvalue로 간주되기 때문에 발생합니다.

이유:

Rvalue는 일반적으로 이름이 없거나 이름이 손실되는 엔터티입니다. 곧 이름. Rvalue 참조는 rvalue에만 바인딩할 수 있습니다. 그러나 t에는 이름이 있으며 수명이 즉시 만료되지 않습니다.

T&& 유형:

T&&는 rvalue 참조 유형입니다. rvalue에만 바인딩할 수 있지만 그렇지 않은 경우 rvalue 참조 유형의 lvalue로 작동합니다. rvalue 참조 특성은 생성하는 동안과 decltype(variable_name)을 수행할 때만 중요합니다.

std::move()의 역할:

std::move( )는 다음을 수행하여 rvalue 참조를 반환합니다. static_cast(t).

관련 규칙:

  • 함수에서 명명된 값을 반환할 때 rvalue 참조 매개변수로의 암시적 이동이 발생합니다. , 또는 값에 이름이 없는 경우.
  • rvalue 참조와 const&만 바인딩할 수 있습니다. rvalues.
  • Rvalue 참조 및 const&는 생성자 외부의 참조에 직접 바인딩될 때 수명이 연장됩니다.
  • T가 X& 또는 X const& 유형인 경우 참조 축소는 T&&를 X& 또는 X const&로 변환합니다. .
  • 유형 추론 맥락에서 T&&는 T를 X, X&, X const& 또는 X로 추론합니다. 인수 유형에 따른 const&&

위 내용은 Rvalue 참조 매개변수는 언제 C의 Lvalue 인수에 바인딩될 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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