프로그래밍/C,C++

[Modern C++] 우측값 레퍼런스

GONII 2025. 2. 24. 16:37
  1. 이름이 없으면 우측값, 이름이 있으면 좌측값
    • 일반적으로 이름이 붙어 있으면 좌측값(lvalue), 이름이 없이 임시로 생성된 값은 우측값(rvalue) 입니다.
      int a = 10; // a는 좌측값 (이름이 있음)
      int&& r = 5; // 5는 우측값 (이름이 없음)
      int b = a; // a는 좌측값
  2. 우측값 레퍼런스 (Type&&)
    • Type&& 는 우측값을 가리킬 수 있는 레퍼런스입니다.
    • 우측값 레퍼런스를 사용하면 임시 객체의 수명을 연장할 수 있습니다.
      int&& r = 10; // 10은 우측값이지만 r이 레퍼런스로 붙잡고 있어 소멸되지 않음
  3. std::move(arg)
    • std::move(arg) 는 arg를 강제로 우측값으로 캐스팅합니다.
    • std::move를 사용하면 더 이상 원래 변수를 사용하지 않을 것이라는 의미가 됩니다.
      std::string s1 = "hello";
      std::string s2 = std::move(s1); // s1의 데이터를 s2로 이동
    • std::move를 사용한 후 s1을 사용하면 예상치 못한 결과가 발생할 수 있습니다.
  4. std::forward<T>(arg)
    • std::forward<T>(arg) 는 *완벽 전달(perfect forwarding)*을 위해 사용됩니다.
    • std::move와 달리, 좌측값은 그대로 좌측값으로, 우측값은 우측값으로 전달합니다.
      template <typename T> void wrapper(T&& arg)
      {
      	process(std::forward<T>(arg)); // arg가 우측값이면 우측값으로, 좌측값이면 좌측값으로 전달
      }

      std::forward는 템플릿에서 전달받은 값이 원래 어떤 값이었는지를 유지하면서 전달할 때 필요합니다.

결론

✅ std::move → 강제적으로 우측값 캐스팅
✅ std::forward<T> → 완벽 전달 (좌/우 유지)

참고
★ ★ ★ ★ ★
https://modoocode.com/227

 

씹어먹는 C++ - <12 - 1. 우측값 레퍼런스와 이동 생성자>

모두의 코드 씹어먹는 C++ - <12 - 1. 우측값 레퍼런스와 이동 생성자> 작성일 : 2018-03-24 이 글은 74991 번 읽혔습니다. 이번 강좌에서는 복사 생략 (Copy elision)우측값 레퍼런스 (rvalue referen ce)이동 생성

modoocode.com

https://modoocode.com/228

 

씹어먹는 C++ - <12 - 2. Move 문법 (std::move semantics) 과 완벽한 전달 (perfect forwarding)>

모두의 코드 씹어먹는 C++ - <12 - 2. Move 문법 (std::move semantics) 과 완벽한 전달 (perfect forwarding)> 작성일 : 2018-03-27 이 글은 48439 번 읽혔습니다. 등에 대해 다룹니다. 안녕하세요 여러분! 지난번의 우

modoocode.com

https://modoocode.com/189

 

씹어먹는 C++ 토막글 ① - Rvalue(우측값) 레퍼런스에 관해

함수의 오버로딩에서 void foo(X& x); 는 좌측값 참조 오버로딩, void foo(X&& x); 은 우측값 참조 오버로딩 여러분은 이를 통해 foo 가 좌측값에, 혹은 우측값에 호출됨에 따라서 상황을 적절하게 처리할

modoocode.com

 

 

반응형