[code]

#include <stdio.h>

class Buf
{
	char buf[256];
};

Buf foo()
{
	Buf buf;
	printf("%p Buf foo()\n", &buf);
	return buf;
}

void param(Buf buf) // (A)
{
	printf("%p param(Buf buf)\n", &buf);
}

void param_r(Buf& buf) // (B)
{
	printf("%p param_r(Buf& buf)\n", &buf);
}

void param_r(Buf&& buf) // (C)
{
	printf("%p param_r(Buf&& buf)\n", &buf);
}

int main()
{
	Buf buf;
	printf("%p main()\n", &buf);

	param(buf);
	param_r(buf);   // (가)
	param_r(foo()); // (나)
}



[result]

0x7fff5cad08b0 main()
0x7fff5cad07b0 param(Buf buf)      // main 함수 내부 객체로부터 복사가 이루어 진다.
0x7fff5cad08b0 param_r(Buf& buf)   // main 함수 내부 객체의 reference를 받는다.
0x7fff5cad09b0 Buf foo()
0x7fff5cad09b0 param_r(Buf&& buf)  // foo 함수 return 객체(rvalue)의 reference를 받는다.



[description]

(A) 함수로 객체가 넘어 갈 때에는 복사가 이루어 진다.

반면에 (B) 및 (C) 함수로 객체가 넘어갈 때에는 복사가 이루어 지지 않는다.


(A)와 (B), (A)와 (C)는 함수 이름이 같으면 안된다(ambiguous error가 난다).

반면에 (B)와 (C)는 함수 이름이 같아도 된다. 넘어 가는 인자가 lvalue(가)인지 rvalue(나)인지가 명확하기 때문이다.


rvalue 컴파일을 위해서는 gcc 옵션에서 "-std=c++11"를 추가해 줘야 한다.



[download]

rvalue_test.tar.gz