std::move()는 lvalue에 무엇을 합니까?
std::move()는 C에서 lvalue를 촉진하는 강력한 도구입니다. 완벽한 전달. 그러나 이를 구현하면 언뜻 보기에 눈썹이 몇 개 나올 수 있습니다. std::move()가 이를 달성하는 방법을 명확히 하기 위해 구현의 복잡성을 자세히 살펴보겠습니다.
'이동' 함수 이해
다음부터 시작하겠습니다. 'move' 함수 템플릿의 단순화된 버전:
templatetypename remove_reference ::type&& move(T&& arg) { return static_cast ::type&&>(arg); }
사례 1: R값 전달
std::move()가 rvalue(rvalue로 평가되는 임시 개체 또는 표현식)와 함께 호출되는 경우 , 이동 템플릿은 다음과 같이 인스턴스화됩니다.
// move with [T = Object]: remove_reference
remove_reference
Object&& move(Object&& arg) { return static_cast
예상한 대로 함수는 rvalue 인수를 rvalue 참조로 변환합니다.
사례 2: Lvalue 전달
이제 흥미로운 점은 이 경우는 std::move()가 lvalue(명명된 변수 또는 다음으로 평가되는 표현식)로 호출될 때 발생합니다. lvalue).
Object a; // a is lvalue Object b = std::move(a);
이번에는 이동 템플릿이 다음으로 인스턴스화됩니다.
// move with [T = Object&] remove_reference
다시 말하지만, Remove_reference
Object&& move(Object& && arg) { return static_cast
첫눈에는 lvalue를 전달했기 때문에 이는 직관적이지 않은 것처럼 보입니다. 그러나 C 11에는 참조 구문의 해석을 수정하는 참조 축소 개념이 도입되었습니다. = 객체 &
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3