std::move의 이름이 std::move인 이유는 무엇입니까?
이름에도 불구하고 std::move(x)는 물리적으로 무엇이든 움직여 보세요. 대신, 특히 xvalue라고 알려진 rvalue에 대한 캐스트일 뿐입니다. 이 용어는 알려진 고정 값이 있는 표현식을 참조하는 prvalue와 대조됩니다.
std::move에 대한 명명 규칙의 목적은 오해를 불러일으키기 위한 것이 아니라 코드 가독성을 높이기 위한 것입니다.
원래 lvalue를 rvalue로 캐스팅하려면 static_cast
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!