"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > std::move()는 C++에서 Lvalue를 어떻게 처리합니까?

std::move()는 C++에서 Lvalue를 어떻게 처리합니까?

2024년 11월 13일에 게시됨
검색:386

How Does std::move() Handle Lvalues in C  ?

std::move()는 lvalue에 무엇을 합니까?

std::move()는 C에서 lvalue를 촉진하는 강력한 도구입니다. 완벽한 전달. 그러나 이를 구현하면 언뜻 보기에 눈썹이 몇 개 나올 수 있습니다. std::move()가 이를 달성하는 방법을 명확히 하기 위해 구현의 복잡성을 자세히 살펴보겠습니다.

'이동' 함수 이해

다음부터 시작하겠습니다. 'move' 함수 템플릿의 단순화된 버전:

template 
typename remove_reference::type&& move(T&& arg)
{ return static_cast::type&&>(arg); }

사례 1: R값 전달

std::move()가 rvalue(rvalue로 평가되는 임시 개체 또는 표현식)와 함께 호출되는 경우 , 이동 템플릿은 다음과 같이 인스턴스화됩니다.

// move with [T = Object]:
remove_reference::type&& move(Object&& arg)
{ return static_cast::type&&>(arg); }

remove_reference는 Object를 Object로 변환하므로 결국 다음과 같이 됩니다.

Object&& move(Object&& arg) { return static_cast(arg); }

예상한 대로 함수는 rvalue 인수를 rvalue 참조로 변환합니다.

사례 2: Lvalue 전달

이제 흥미로운 점은 이 경우는 std::move()가 lvalue(명명된 변수 또는 다음으로 평가되는 표현식)로 호출될 때 발생합니다. lvalue).

Object a; // a is lvalue
Object b = std::move(a);

이번에는 이동 템플릿이 다음으로 인스턴스화됩니다.

// move with [T = Object&]
remove_reference::type&& move(Object& && arg)
{ return static_cast::type&&>(arg); }

다시 말하지만, Remove_reference는 Object&를 Object로 변환하여 결과는 다음과 같습니다.

Object&& move(Object& && arg) { return static_cast(arg); }

첫눈에는 lvalue를 전달했기 때문에 이는 직관적이지 않은 것처럼 보입니다. 그러나 C 11에는 참조 구문의 해석을 수정하는 참조 축소 개념이 도입되었습니다. = 객체 &

    객체 & && & = 객체 &
  • 객체 & && & && = 객체 & &&
  • 이러한 규칙에 따라 Object& &&는 lvalue에 바인딩할 수 있는 일반 lvalue 참조인 Object&처럼 효과적으로 작동합니다.
  • 따라서 함수의 최종 형식은 다음과 같습니다.
객체&& move(Object& arg) { return static_cast(arg); }

기본적으로 std::move()는 lvalue 인수를 rvalue 참조로 캐스팅하여 입력 유형에 관계없이 완벽한 전달을 가능하게 합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3