std::move는 어떻게 표현식을 Rvalue로 변환합니까?
std::move()는 표현식을 rvalue로 쉽게 변환합니다(오른쪽). 값 참조) 이동 의미를 활성화합니다. 그러나 MSVC 표준 라이브러리의 구현은 복잡할 수 있습니다.
구현은 다음과 같습니다.
template<class _Ty> inline typename tr1::_Remove_reference<_Ty>::_Type&& move(_Ty&& _Arg) { // forward _Arg as movable return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); }
이것이 어떻게 작동하는지 살펴보겠습니다.
Object obj1; Object obj2 = std::move(obj1); // _Ty&& _Arg binds to obj1
std::move()를 호출하면 _Arg 참조 매개변수가 lvalue obj1에 바인딩됩니다. 그러나 rvalue 참조를 lvalue에 직접 바인딩하는 것은 허용되지 않으므로 (Object&&)와 같은 rvalue 참조에 대한 캐스트가 필요할 것으로 예상할 수 있습니다.
std:: 구현에 대해 더 자세히 알아보세요. Remove_reference는 문제를 명확히 합니다.
template<class _Ty> struct _Remove_reference { // remove reference typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference<_Ty&> { // remove reference typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference<_Ty&&> { // remove rvalue reference typedef _Ty _Type; };
이 구현에서는 Remove_reference가 T&를 T로, T&&를 T로, T&&&로 변환한다는 것을 보여줍니다. 따라서 obj1이 Object 유형의 lvalue인 경우 결과 함수는 다음과 같습니다.
Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
더 자세히 설명하면:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
명명된 rvalue 참조는 lvalue로 처리되고 lvalue에서 rvalue 참조로의 암시적 변환은 허용되지 않으므로 Object&&로의 형변환이 필요합니다.
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
여기서 C 11의 참조 축소 규칙이 적용되어 Object& && 표현식이 lvalue 참조인 Object&로 해석될 수 있으며 이는 실제로 lvalue에 바인딩될 수 있습니다. 따라서 최종 함수는 인수를 rvalue 참조로 변환하고 반환합니다.
결론적으로 std::move()는 std::remove_reference를 활용하여 lvalue와 rvalue를 모두 rvalue로 변환하여 이동을 용이하게 합니다. C의 의미.
위 내용은 `std::move()`는 어떻게 C에서 lvalue를 rvalue로 변환합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!