> 백엔드 개발 > C++ > 본문

`std::move()`는 어떻게 C에서 lvalue를 rvalue로 변환합니까?

Linda Hamilton
풀어 주다: 2024-11-21 08:14:09
원래의
445명이 탐색했습니다.

How does `std::move()` achieve the conversion of lvalues to rvalues in C  ?

std::move는 어떻게 표현식을 Rvalue로 변환합니까?

std::move()는 표현식을 rvalue로 쉽게 변환합니다(오른쪽). 값 참조) 이동 의미를 활성화합니다. 그러나 MSVC 표준 라이브러리의 구현은 복잡할 수 있습니다.

구현은 다음과 같습니다.

template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&amp;&amp;
move(_Ty&amp;&amp; _Arg)
{ // forward _Arg as movable
    return ((typename tr1::_Remove_reference<_Ty>::_Type&amp;&amp;)_Arg);
}
로그인 후 복사

이것이 어떻게 작동하는지 살펴보겠습니다.

Object obj1;
Object obj2 = std::move(obj1); // _Ty&amp;&amp; _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&amp;>
{ // remove reference
    typedef _Ty _Type;
};

template<class _Ty>
struct _Remove_reference<_Ty&amp;&amp;>
{ // remove rvalue reference
    typedef _Ty _Type;
};
로그인 후 복사

이 구현에서는 Remove_reference가 T&를 T로, T&&를 T로, T&&&로 변환한다는 것을 보여줍니다. 따라서 obj1이 Object 유형의 lvalue인 경우 결과 함수는 다음과 같습니다.

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

더 자세히 설명하면:

  • 이동이 호출될 때 rvalue(예: std::move(Object())), T는 Object가 되고 결과 함수는 is:
Object&amp;&amp; move(Object&amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}
로그인 후 복사

명명된 rvalue 참조는 lvalue로 처리되고 lvalue에서 rvalue 참조로의 암시적 변환은 허용되지 않으므로 Object&&로의 형변환이 필요합니다.

  • 이전 예에서와 같이 move는 lvalue로 호출되며 T는 Object&가 되고 결과 함수는 is:
Object&amp;&amp; move(Object&amp; &amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}
로그인 후 복사

여기서 C 11의 참조 축소 규칙이 적용되어 Object& && 표현식이 lvalue 참조인 Object&로 해석될 수 있으며 이는 실제로 lvalue에 바인딩될 수 있습니다. 따라서 최종 함수는 인수를 rvalue 참조로 변환하고 반환합니다.

결론적으로 std::move()는 std::remove_reference를 활용하여 lvalue와 rvalue를 모두 rvalue로 변환하여 이동을 용이하게 합니다. C의 의미.

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

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