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
행동 이해
방법을 보여주기 위해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!