&& 연산자란 무엇인가?
C++에서 &&(이중 앰퍼샌드)는 C++11 표준에서 새롭게 도입된 참조 연산자입니다. int&& a와 같이 선언하면 변수 a가 r값 참조(rvalue reference)임을 의미합니다.
이 연산자는 주로 함수의 매개변수를 선언할 때 사용되며, 오직 r값(rvalue) 표현식만 인자로 받아들일 수 있다는 특징이 있습니다.
l값(Lvalue)과 r값(Rvalue)의 차이
간단히 설명하면, r값은 메모리 주소를 가지지 않는 값입니다. 예를 들어 숫자 6이나 문자 'v'는 모두 r값에 해당합니다.
반면 int a로 선언된 변수 a는 l값(lvalue)이지만, (a + 2)처럼 연산 결과로 생성되는 임시 값은 r값입니다. 즉, 이름을 가지고 주소를 취할 수 있는 것이 l값, 이름 없이 일시적으로 존재하는 값이 r값이라고 이해하면 됩니다.
예제 코드
void foo(int&& a)
{
// 마법 같은 코드...
}
int main()
{
int b;
foo(b); // 오류! r값 참조는 l값을 가리킬 수 없습니다.
foo(5); // 정상 컴파일. 5는 r값입니다.
foo(b + 3); // 정상 컴파일. (b + 3)은 임시 r값입니다.
int&& c = b; // 오류! r값 참조는 l값을 가리킬 수 없습니다.
int&& d = 5; // 정상 컴파일. 5는 r값입니다.
}위 예제에서 확인할 수 있듯이, r값 참조에는 변수 b 자체나 l값을 직접 전달할 수 없으며, 리터럴 상수나 연산식처럼 임시로 생성되는 값만 전달할 수 있습니다.
r값 참조가 중요한 이유
r값 참조는 단순한 문법 요소를 넘어 이동 시맨틱(move semantics)과 완전 전달(perfect forwarding)의 핵심 기반입니다. 임시 객체가 소유한 리소스를 복사하지 않고 그대로 "이동"시킴으로써, 불필요한 깊은 복사 비용을 제거하고 프로그램 성능을 크게 향상시킬 수 있습니다.
r값과 && 연산자에 대해 더 자세히 알고 싶다면 MSDN 블로그의 공식 문서(Rvalue References: C++0x Features in VC10)를 참고하는 것도 좋은 방법입니다.