0Pricing
C++ Academy · 강의

rvalue 참조와 && 구문

rvalue 참조로 임시 객체에 연결하여 자원을 효율적으로 이전합니다.

rvalue 참조와 && 구문은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

&& 문법

r값 참조는 T&&로 선언합니다. 이 참조는 곧 소멸할 임시 객체인 r값에만 바인딩됩니다.

int&& ref = 42;          // OK: binds to literal
int x = 10;
// int&& bad = x;        // ERROR: x is an lvalue

r값 참조가 필요한 이유

인수가 곧 소멸할 것임을 아는 함수를 작성할 수 있습니다. 복사하지 않고 인수의 자원을 가져올 수 있습니다.

참조 형식에 따른 함수 오버로드

T&와 T&&를 기준으로 함수를 오버로드할 수 있습니다. 컴파일러는 인수의 범주에 따라 올바른 함수를 선택합니다.

void process(std::string& s) { std::cout << "lvalue\n"; }
void process(std::string&& s) { std::cout << "rvalue\n"; }

std::string s = "hi";
process(s);            // lvalue
process("temp");       // rvalue
process(std::move(s)); // rvalue

이름이 있는 r값 참조는 l값이 됩니다

r값 참조에 이름을 지정하면 그 이름 자체가 l값이 됩니다. 식별성이 고정되기 때문입니다. r값의 성질을 되찾으려면 std::move를 사용하십시오.

void f(std::string&& s) {
    // inside f, the parameter s is an lvalue
    g(s);              // passes s by lvalue
    h(std::move(s));   // passes s as an rvalue
}

std::move는 형 변환입니다

std::move(x)는 그 자체로 아무것도 이동하지 않습니다. x를 r값 참조로 반환하는 형 변환일 뿐입니다. 실제 이동은 이를 받는 생성자에서 일어납니다.

// equivalent to
static_cast<std::string&&>(s)

이동이라고 부르는 이유

이 이름은 일반적인 사용 방식, 즉 내용물을 훔치려는 객체를 전달하는 상황을 나타냅니다. 하지만 std::move 자체가 아무것도 전송하지는 않습니다.

보편 참조(전달 참조)

추론된 T를 사용하는 템플릿에 T&&가 나타나면 이를 전달 참조라고 합니다. l값과 r값 모두에 바인딩되며 범주를 유지합니다.

template <typename T>
void wrapper(T&& arg) {
    process(std::forward<T>(arg));
}

참조 축약

템플릿을 통해 참조가 겹쳐지면 언어가 다음과 같이 축약합니다:

  • T& & → T&
  • T& && → T&
  • T&& & → T&
  • T&& && → T&&

move를 사용하지 말아야 할 때

int, double, 포인터처럼 단순 복사 가능한 형식에서는 이동이 복사와 같습니다. std::move를 호출해도 이점이 없으며 독자를 혼란스럽게 할 수 있습니다.

소유 자원 없이 이동하기

힙 자원이 없는 형식에서는 이동 생성자가 복사 생성자와 같습니다. 이동은 동적 메모리를 소유하는 형식에서만 유용합니다.

흔한 주의 사항: const 객체에서 이동하기

const 객체에 std::move를 사용하면 아무 작업도 하지 않습니다. 이동 생성자는 원본을 수정해야 하므로 const 객체에 대해 호출할 수 없습니다.

빠른 확인

std::move(x)는 실제로 무엇을 합니까?

복습

T&&는 r값에 바인딩됩니다. 이름이 있는 r값 참조는 l값이 되므로, r값의 성질을 되찾으려면 std::move를 사용하십시오. 템플릿에서 T&&는 전달 참조입니다. std::move는 형 변환이며, 이동 자체를 수행하지는 않습니다.

자주 묻는 질문

“rvalue 참조와 && 구문” 강의는 무료인가요?

네 — “rvalue 참조와 && 구문” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“rvalue 참조와 && 구문”에서 뭘 배우나요?

rvalue 참조로 임시 객체에 연결하여 자원을 효율적으로 이전합니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C++ Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“rvalue 참조와 && 구문” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. lvalue와 rvalue의 차이
  2. rvalue 참조와 && 구문
  3. std::move와 std::forward
  4. 이동 생성자와 이동 대입
← C++ Academy(으)로 돌아가기