Program Language/C & C++

[C++] std::move

야곰야곰+책벌레 2021. 10. 8. 10:19
728x90
반응형
template <class T>
constexpr typename std::remove_reference<T>::type&& move(T&& t) noexcept;

std::move는 C++11에 도입된 개념으로 t가 가지고 있는 자원을 다른 객체에게 효율적으로 전달하는 것을 의미한다. std::move는 이동을 수행하지는 않는다. 이동될 수 있음을 알려주는 역할만 한다. std::move 된 객체를 함수에 전달한다면, 우측 값 레퍼런스를 인자로 받는 함수 (이동 생성자, 이동 대입 연산자, push_back 등)가 오버 로딩되어서 선택된다. 참고로 우측 값 레퍼런스 자체는 lvalue이기 대문에, 이동 생성자나 이동 대입 연산자 내부에서 std::move를 호출하는 경우가 많다.

// 이동 생성자
A(A&& arg)
    : member(
        std::move(arg.member))  // "arg.member" 식 자체는 좌측값 (lvalue) 이다.
{}
// 이동 대입 연산자
A& operator=(A&& other) {
  member = std::move(other.member);
  return *this;
}

std::move의 사용

실제로 std::move는 lvalue를 rvalue로 casting 하는 역할을 한다.

#include <iostream>
using namespace std;

class A
{
public:
	A() = default;
	A(string str) : data(str) {}
	string data;
};

int main()
{
	A a("aaa");
	A b;
	A c;

	b = a; // a는 b에 copy 된다.
	cout << "a class data = [" << a.data.c_str() << "], b class data = [" << b.data.c_str() << "]\n";
	c = std::move(a); // a는 c에 move 된다.
	cout << "a class data = [" << a.data.c_str() << "], b class data = [" << c.data.c_str() << "]\n";
	
	return 0;
}

728x90
반응형

'Program Language > C & C++' 카테고리의 다른 글

[C++] std::async  (0) 2021.10.19
[C++] values  (0) 2021.10.08
[C++] packaged_task  (2) 2021.10.07
[C++] thread_local  (0) 2021.10.07
[C++] error LNK2001: unresolved external symbol (Static member)  (0) 2021.10.07