콘텐츠로 이동

Rvalue 참조 (Rvalue References)

아래 나열된 특정한 특수한 경우에만 rvalue 참조를 사용하십시오.

Rvalue 참조는 임시 개체에만 바인딩할 수 있는 참조 유형입니다. 구문은 기존 참조 구문과 유사합니다. 예를 들어 void f(std::string&& s); 인수가 std::string에 대한 rvalue 참조인 함수를 선언합니다.

함수 매개변수의 정규화되지 않은 템플릿 인수에 '&&' 토큰이 적용되면 특별한 템플릿 인수 추론 규칙이 적용됩니다. 이러한 참조를 전달 참조라고 합니다.

  • 이동 생성자(클래스 유형에 대한 rvalue 참조를 사용하는 생성자)를 정의하면 값을 복사하는 대신 값을 이동할 수 있습니다. 예를 들어, v1이 std::Vector인 경우 auto v2(std::move(v1))는 많은 양의 데이터를 복사하는 대신 간단한 포인터 조작을 발생시킬 것입니다. 많은 경우 이로 인해 성능이 크게 향상될 수 있습니다.
  • Rvalue 참조를 사용하면 이동 가능하지만 복사할 수 없는 유형을 구현할 수 있습니다. 이는 복사에 대한 합리적인 정의가 없지만 여전히 함수 인수로 전달하거나 컨테이너에 넣을 수 있는 유형에 유용할 수 있습니다.
  • std::move는 std::unique_ptr과 같은 일부 표준 라이브러리 유형을 효과적으로 사용하는 데 필요합니다.
  • rvalue 참조 토큰을 사용하는 전달 참조를 사용하면 인수를 다른 함수로 전달하고 인수가 임시 개체 및/또는 const인지 여부에 관계없이 작동하는 일반 함수 래퍼를 작성할 수 있습니다. 이를 '완벽한 전달'이라고 합니다.

  • Rvalue 참조는 널리 이해되지 않습니다. 참조 축소 및 참조 전달에 대한 특별 공제 규칙과 같은 규칙은 다소 모호합니다.

  • Rvalue 참조는 종종 잘못 사용됩니다. rvalue 참조를 사용하는 것은 함수 호출 후 인수가 유효한 지정된 상태를 가질 것으로 예상되거나 이동 작업이 수행되지 않는 서명에서 직관적이지 않습니다.

다음 경우를 제외하고는 rvalue 참조를 사용하지 마세요(또는 메소드에 && 한정자를 적용하십시오).

  • 이를 사용하여 이동 생성자와 이동 할당 연산자를 정의할 수 있습니다(복사 가능 및 이동 가능 유형에 설명된 대로).
  • 이를 사용하여 *this 를 논리적으로 "소비"하여 사용할 수 없거나 빈 상태로 남겨두는 && 한정 메서드를 정의할 수 있습니다. 이는 메소드 한정자(함수 시그니처의 닫는 괄호 뒤에 오는)에만 적용됩니다. 일반 함수 매개변수를 "사용"하려면 값으로 전달하는 것이 좋습니다.
  • 완벽한 전달을 지원하기 위해 std::forward 와 함께 전달 참조를 사용할 수 있습니다.
  • 하나는 Foo&& 를 취하고 다른 하나는 const Foo& 를 취하는 등 오버로드 쌍을 정의하는 데 이를 사용할 수 있습니다. 일반적으로 선호되는 솔루션은 값으로 전달하는 것이지만, 예를 들어 함수가 때때로 입력을 사용하지 않는 경우 오버로드된 함수 쌍이 더 나은 성능을 제공하는 경우도 있습니다. 항상 그렇듯이, 성능을 위해 더 복잡한 코드를 작성하는 경우 실제로 도움이 된다는 증거가 있는지 확인하세요.

이해하기 쉽게 설명하기

핵심: 정해진 몇 가지 경우에만 사용

rvalue 참조(T&&)는 임시 객체에 바인딩되는 참조입니다. 널리 이해되지 않고 오용되기 쉬우므로, 아래의 정해진 경우에만 쓰세요.

허용되는 경우

  1. 이동 생성자·이동 할당 연산자 정의 (복사 대신 이동으로 성능 향상)
  2. && 한정 메서드: *this를 논리적으로 "소비"하는 메서드 (함수 시그니처 닫는 괄호 뒤 한정자)
  3. 완벽한 전달(perfect forwarding): 전달 참조 + std::forward
  4. 오버로드 쌍(Foo&& / const Foo&): 보통은 값 전달이 낫지만, 성능 이점이 입증될 때
auto v2(std::move(v1));  // 대량 복사 대신 포인터 몇 개만 옮김

주의

전달 참조의 추론 규칙(참조 축소 등)은 모호하고 직관적이지 않습니다. 성능을 위해 복잡한 코드를 쓸 때는 실제로 이득이 있다는 증거를 확인하세요.