std::move() 및 표현식을 R값으로 변환
std::move()는 C의 강력한 함수입니다. 개체를 복사하지 않고도 한 위치에서 다른 위치로 이동할 수 있습니다. 구현을 이해하는 것은 어려울 수 있지만 기능을 활용하는 데 필수적입니다.
구현 세부 정보
MSVC 표준 라이브러리에서 std::move() 구현은 다음을 사용합니다. 표현식을 rvalue로 변환하는 std::remove_reference 템플릿. 작동 방식은 다음과 같습니다.
template<class _Ty> inline typename tr1::_Remove_reference< _Ty >:: _Type& && move( _Ty && _Arg ) { return ((typename tr1::_Remove_reference< _Ty >:: _Type&&) _Arg); }
Lvalue에 바인딩
lvalue를 std::move()에 전달하면 _Arg 참조 매개변수가 lvalue에 바인딩됩니다. . 그러나 rvalue 참조를 lvalue에 직접 바인딩할 수는 없습니다. 이 문제를 해결하기 위해 구현에서는 std::static_cast를 사용하여 lvalue를 rvalue 참조로 캐스팅합니다.
std::remove_reference 이해
std::remove_reference를 사용하여 제거합니다. 유형의 참조. 구현은 다음과 같습니다.
template<class _Ty> struct _Remove_reference { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty && > { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty &&&&> { typedef _Ty _Type };
Rvalue 사용
std::move()가 rvalue와 함께 호출되면 std::remove_reference는 T&&를 T로 변환합니다. 그 결과 다음과 같은 함수 템플릿 인스턴스화가 발생합니다.
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
캐스트 명명된 rvalue 참조는 lvalue로 처리되기 때문에 필요합니다.
Lvalue 사용
std::move()가 lvalue와 함께 호출되면 std::remove_reference는 다음을 변환합니다. T&에서 T로, 다음과 같은 함수 템플릿 인스턴스화가 발생합니다.
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
참조 C 11 표준에서 제공하는 축소 규칙을 사용하면 Object& &&가 lvalue에 바인딩될 수 있습니다. 결과 함수는 lvalue 인수를 rvalue 참조로 효과적으로 변환합니다.
결론
std::move()는 std::remove_reference 및 참조 축소 규칙을 활용하여 lvalue와 rvalue를 모두 rvalue 참조로 변환합니다. 이를 통해 효율적인 개체 이동과 메모리 사용 최적화가 가능합니다.
위 내용은 `std::move()`는 C에서 표현식을 rvalue로 어떻게 변환합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!