> 백엔드 개발 > C++ > 실제로 아무것도 움직이지 않는데 std::move가 std::move라고 불리는 이유는 무엇입니까?

실제로 아무것도 움직이지 않는데 std::move가 std::move라고 불리는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-14 19:09:02
원래의
604명이 탐색했습니다.

Why is std::move called std::move if it doesn't actually move anything?

std::move의 이름이 std::move인 ​​이유는 무엇입니까?

이름에도 불구하고 std::move(x)는 물리적으로 무엇이든 움직여 보세요. 대신, 특히 xvalue라고 알려진 rvalue에 대한 캐스트일 뿐입니다. 이 용어는 알려진 고정 값이 있는 표현식을 참조하는 prvalue와 대조됩니다.

std::move에 대한 명명 규칙의 목적은 오해를 불러일으키기 위한 것이 아니라 코드 가독성을 높이기 위한 것입니다.

원래 lvalue를 rvalue로 캐스팅하려면 static_cast(a)라는 생소한 구문이 필요했습니다. 이 코드 조각은 이 방법을 사용하여 두 값을 바꾸는 방법을 보여줍니다.

template <class T>
void swap(T& a, T& b)
{
    T tmp(static_cast<T&&>(a));
    a = static_cast<T&&>(b);
    b = static_cast<T&&>(tmp);
}
로그인 후 복사

static_cast를 std::move로 바꾸면 코드가 더욱 직관적이 되고 값을 이동하는 함수의 의도를 전달합니다. 복사하는 대신:

template <class T>
void swap(T& a, T& b)
{
    T tmp(std::move(a));
    a = std::move(b);
    b = std::move(tmp);
}
로그인 후 복사

std::move를 사용하면 프로그래머는 rvalue와 이동 의미의 복잡한 세부 사항을 완전히 이해하지 못하더라도 값이 이동되고 있음을 명확하게 확인할 수 있습니다.

또한 프로그래머는 원하는 경우 값을 rvalue로 변환하기 위해 자신만의 함수나 매크로를 자유롭게 정의할 수 있습니다. 예를 들어 다음 코드 조각은 set_value_category_to_xvalue:

template <class T>
inline
constexpr
auto& set_value_category_to_xvalue(T&& t) noexcept
{
    return static_cast<std::remove_reference_t<T>&>(t);
}
로그인 후 복사

라는 이름을 사용하여 std::move의 기능을 구현합니다. 최종적으로 std::move에 대해 생성된 개체 코드는 실제 이동을 포함하지 않지만 재생됩니다. 컴파일하는 동안 중요한 역할을 합니다. 호출되는 함수의 오버로드를 변경하여 잠재적으로 클래스에 정의된 보다 효율적인 이동 할당 연산자를 호출하게 됩니다.

위 내용은 실제로 아무것도 움직이지 않는데 std::move가 std::move라고 불리는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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