std::move()는 lvalue에 어떤 역할을 합니까?
std::move()는 C에서 lvalue를 촉진하는 강력한 도구입니다. 완벽한 전달. 그러나 이를 구현하면 언뜻 보기에 눈썹이 몇 개 나올 수 있습니다. std::move()가 이를 달성하는 방법을 명확히 하기 위해 구현의 복잡성을 자세히 살펴보겠습니다.
'이동' 기능 이해
다음부터 시작하겠습니다. 'move' 함수 템플릿의 단순화된 버전:
template <typename T> typename remove_reference<T>::type&& move(T&& arg) { return static_cast<typename remove_reference<T>::type&&>(arg); }
사례 1: Rvalue 전달
std::move()가 rvalue로 호출되는 경우 (임시 개체 또는 rvalue로 평가되는 표현식) 이동 템플릿은 다음과 같이 인스턴스화됩니다.
// move with [T = Object]: remove_reference<Object>::type&& move(Object&& arg) { return static_cast<remove_reference<Object>::type&&>(arg); }
Since Remove_reference
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
예상대로 함수는 rvalue 인수를 rvalue 참조로 캐스팅합니다.
사례 2: Lvalue 전달
이제 std::move()가 lvalue(이름이 지정된 변수 또는 lvalue로 평가되는 표현식)와 함께 호출될 때 흥미로운 사례가 발생합니다.
Object a; // a is lvalue Object b = std::move(a);
이것은 시간이 지나면 이동 템플릿은 다음으로 인스턴스화됩니다.
// move with [T = Object&] remove_reference<Object&>::type&& move(Object& && arg) { return static_cast<remove_reference<Object&>::type&&>(arg); }
다시, Remove_reference
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
첫눈에 이는 lvalue를 전달했기 때문에 직관에 어긋나는 것처럼 보입니다. 그러나 C 11에서는 참조 구문의 해석을 수정하는 참조 축소 개념을 도입합니다.
이러한 규칙에 따라 Object& &&는 효과적으로 Object&로 동작합니다. , lvalue에 바인딩할 수 있는 일반적인 lvalue 참조입니다.
따라서 함수의 최종 형식은 다음과 같습니다.
Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
본질적으로 std::move()는 lvalue 인수를 다음으로 캐스팅합니다. 입력 유형에 관계없이 완벽한 전달을 가능하게 하는 rvalue 참조입니다.
위 내용은 std::move()는 C에서 Lvalue를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!