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 |