> 백엔드 개발 > C++ > std::move()는 C에서 Lvalue를 어떻게 처리합니까?

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

Mary-Kate Olsen
풀어 주다: 2024-11-14 14:46:02
원래의
415명이 탐색했습니다.

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

std::move()는 lvalue에 어떤 역할을 합니까?

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

'이동' 기능 이해

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

template <typename T>
typename remove_reference<T>::type&& move(T&& arg)
{ return static_cast<typename remove_reference<T>::type&&>(arg); }
로그인 후 복사

사례 1: Rvalue 전달

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

// move with [T = Object]:
remove_reference<Object>::type&& move(Object&& arg)
{ return static_cast<remove_reference<Object>::type&&>(arg); }
로그인 후 복사

Since Remove_reference Object를 Object로 변환하면 다음과 같이 끝납니다.

Object&& move(Object&& arg) { return static_cast<Object&&>(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<Object&>::type&& move(Object& && arg)
{ return static_cast<remove_reference<Object&>::type&&>(arg); }
로그인 후 복사

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

Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
로그인 후 복사

첫눈에 이는 lvalue를 전달했기 때문에 직관에 어긋나는 것처럼 보입니다. 그러나 C 11에서는 참조 구문의 해석을 수정하는 참조 축소 개념을 도입합니다.

  • Object & & = Object &
  • Object & & && = Object &
  • Object & && & = Object &
  • Object & && & && = Object & &&

이러한 규칙에 따라 Object& &&는 효과적으로 Object&로 동작합니다. , lvalue에 바인딩할 수 있는 일반적인 lvalue 참조입니다.

따라서 함수의 최종 형식은 다음과 같습니다.

Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
로그인 후 복사

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

위 내용은 std::move()는 C에서 Lvalue를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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