최대 1 분 소요

개요

  • 변수(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)