- 이름이 없으면 우측값, 이름이 있으면 좌측값
- 일반적으로 이름이 붙어 있으면 좌측값(lvalue), 이름이 없이 임시로 생성된 값은 우측값(rvalue) 입니다.
int a = 10; // a는 좌측값 (이름이 있음) int&& r = 5; // 5는 우측값 (이름이 없음) int b = a; // a는 좌측값
- 일반적으로 이름이 붙어 있으면 좌측값(lvalue), 이름이 없이 임시로 생성된 값은 우측값(rvalue) 입니다.
- 우측값 레퍼런스 (Type&&)
- Type&& 는 우측값을 가리킬 수 있는 레퍼런스입니다.
- 우측값 레퍼런스를 사용하면 임시 객체의 수명을 연장할 수 있습니다.
int&& r = 10; // 10은 우측값이지만 r이 레퍼런스로 붙잡고 있어 소멸되지 않음
- std::move(arg)
- std::move(arg) 는 arg를 강제로 우측값으로 캐스팅합니다.
- std::move를 사용하면 더 이상 원래 변수를 사용하지 않을 것이라는 의미가 됩니다.
std::string s1 = "hello"; std::string s2 = std::move(s1); // s1의 데이터를 s2로 이동
- std::move를 사용한 후 s1을 사용하면 예상치 못한 결과가 발생할 수 있습니다.
- 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
씹어먹는 C++ - <12 - 2. Move 문법 (std::move semantics) 과 완벽한 전달 (perfect forwarding)>
모두의 코드 씹어먹는 C++ - <12 - 2. Move 문법 (std::move semantics) 과 완벽한 전달 (perfect forwarding)> 작성일 : 2018-03-27 이 글은 48439 번 읽혔습니다. 등에 대해 다룹니다. 안녕하세요 여러분! 지난번의 우
modoocode.com
씹어먹는 C++ 토막글 ① - Rvalue(우측값) 레퍼런스에 관해
함수의 오버로딩에서 void foo(X& x); 는 좌측값 참조 오버로딩, void foo(X&& x); 은 우측값 참조 오버로딩 여러분은 이를 통해 foo 가 좌측값에, 혹은 우측값에 호출됨에 따라서 상황을 적절하게 처리할
modoocode.com
반응형
'프로그래밍 > C,C++' 카테고리의 다른 글
[Mordern C++] golang-style defer 만들기 (1) | 2024.11.29 |
---|---|
함수(function) (0) | 2015.03.24 |
상속의 기능 (0) | 2015.02.14 |