Updated:

less than 1 minute read

개요

  • 변수(auto &&)나 인자(템플릿 인자 - T &&)가 r-value reference(&&) 형태이며 타입 추론이 필요한 레퍼런스
  • 형태는 r-value reference지만 실제 의미는 l-value reference일 수도 있는 레퍼런스
  • l-value도 인자로 받을 수 있음
  • 타입 추론
    • & &는 &
    • & &&는 &
    • && &는 &
    • && &&는 &&


예제

  • 코드
     #include <iostream>
        
     using namespace std;
        
     void func(int &i) { cout << "func(int &i)" << endl; }
     void func(int &&i) { cout << "func(int &&i)" << endl; }
        
     template <typename T> void wrapper0(T &&t) { func(t); };
     template <typename T> void wrapper1(T &&t) { func(forward<decltype(t)>(t)); };
     template <typename T> void wrapper2(T &&t) { func(forward<T>(t)); }
        
     int main() {
     	int i = 0;
     	int &lri = i;
        
     	wrapper0(i);
     	wrapper1(i);
     	wrapper2(i);
        
     	cout << "------" << endl;
        
     	wrapper0(move(i));
     	wrapper1(move(i));
     	wrapper2(move(i));
        
     	cout << "------" << endl;
        
     	wrapper0(lri);
     	wrapper1(lri);
     	wrapper2(lri);
        
     	cout << "------" << endl;
        
     	wrapper0(0);
     	wrapper1(0);
     	wrapper2(0);
        
     	return 0;
     }
    
  • 실행 결과
     func(int &i)
     func(int &i)
     func(int &i)
     ------
     func(int &i)
     func(int &&i)
     func(int &&i)
     ------
     func(int &i)
     func(int &i)
     func(int &i)
     ------
     func(int &i)
     func(int &&i)
     func(int &&i)