> 백엔드 개발 > C++ > std::forward는 어떻게 완벽한 전달을 가능하게 하고 인수의 rvalue-ness를 유지합니까?

std::forward는 어떻게 완벽한 전달을 가능하게 하고 인수의 rvalue-ness를 유지합니까?

Susan Sarandon
풀어 주다: 2024-11-14 17:42:02
원래의
460명이 탐색했습니다.

How does std::forward enable perfect forwarding and preserve the rvalue-ness of arguments?

std::forward 이해: Lvalue 및 Rvalue 참조 전달의 역할

std::forward는 C에서 완벽한 도구입니다. 인수를 전달하여 lvalue 또는 rvalue 참조 여부에 관계없이 최적의 코드 동작을 보장합니다. 통과했습니다.

Lvalue 대 Rvalue 직관

'이름이 있으면 lvalue'라는 오해는 오해를 불러일으킬 수 있습니다. 변수는 일반적으로 lvalue를 보유하지만 이러한 구별은 관련된 컨텍스트 및 작업에 더 중요합니다.

완벽한 전달의 필요성

벡터 v를 저장하는 함수 세트를 고려해보세요. 데이터 구조 _v. 안전한 접근 방식은 집합에서 v에 대한 참조를 취하는 것이지만, 아래 예와 같이 v가 rvalue일 때 불필요한 복사가 발생할 수 있습니다.

set(makeAndFillVector()); // Copies `makeAndFillVector()`'s result into `_v`
로그인 후 복사

rvalue를 보존하려면 완벽한 전달이 필요합니다. v의 특성을 고려하고 불필요한 복사를 피하세요.

std::forward's Role

std::forward는 전달된 참조 유형을 기반으로 특정 함수 오버로드를 호출하여 인수를 생성하는 데 중요한 역할을 합니다. 예를 들면 다음과 같습니다.

template<class T>
void perfectSet(T &&t) {
    set(std::forward<T>(t));
}
로그인 후 복사

perfectSet 내에서 std::forward(t)를 호출하면 컴파일러는 t 유형에 따라 t를 참조 또는 rvalue 참조로 전달하라는 지시를 받습니다.

행동 이해

방법을 보여주기 위해 std::forward는 인수의 rvalue-ness를 유지합니다. 다음 코드를 고려하세요.

void perfectSet(T &&t) {
    set(t); // Preserves `t` as an lvalue
    set(t); // `t` remains unchanged
}
로그인 후 복사

비교:

void perfectSet(T &&t) {
    set(std::forward<T>(t)); // Preserves `t` as an rvalue
    set(t); // `t` is now empty due to move semantics
}
로그인 후 복사

std::forward가 없으면 컴파일러는 다음을 가정합니다. t에 다시 액세스할 수 있으며 이를 lvalue로 유지하기로 선택합니다. 그러나 std::forward를 사용하면 컴파일러가 t를 rvalue로 올바르게 처리할 수 있으므로 해당 내용이 이동됩니다.

위 내용은 std::forward는 어떻게 완벽한 전달을 가능하게 하고 인수의 rvalue-ness를 유지합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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