반응형
std::move
std::move는 전달하려는 객체가 이동되었다는 것을 가리키기 위해서 사용됩니다. (이동을 시키는 것이 아닙니다). 즉 std::move로 전달된 인자는 이동 생성자처럼 rvalue reference로 처리할 수 있습니다.
template <class T>
typename std::remove_reference<T>::type&& move (T && t) noexcept;
Notes
std::move를 함수의 인자로 전달하면 오버로딩 된 함수 들 중 우측 값 참조 (rvalue reference)를 인자로 받을 수 있는 함수 (예들 들어, 이동 생성자, 이동 대입 연산자 등)이 호출됩니다.
참고로 우측값 레퍼런스로 받은 인자는 이름이 있는 lvalue이기 때문에, 이동 생성자나 이동 대입 연산자를 구현할 때 std::move를 호출하여 이동하는 경우가 많습니다. std::move를 사용하지 않으면 lvalue인 인자를 받아 복사 연산이 수행됩니다.
// 이동 생성자 (Move constructor)
A(A&& arg) : member(sdt::move(arg.member)) {}
// 이동 대입 연산자 (Move assignment operator)
A& operator=(A&& other) {
member = std::move(other.member);
return *this;
}
std::move를 사용할 수 없는 한 가지 예외가 있는데 템플릿 인자의 우측값 레퍼런스를 함수의 인자로 받는 경우 (universal reference)입니다. 이 경우에는 std::forward를 사용해야 합니다.
Sample code
#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{
std::string str = "Hello";
std::vector<std::string> v;
// uses the push_back(const T&) overload, which means
// we'll incur the cost of copying str
v.push_back(str);
std::cout << "After copy, str is \"" << str << "\"\n";
// uses the rvalue reference push_back(T&&) overload,
// which means no strings will be copied; instead, the contents
// of str will be moved into the vector. This is less
// expensive, but also means str might now be empty.
v.push_back(std::move(str));
std::cout << "After move, str is \"" << str << "\"\n";
std::cout << "The contents of the vector are \"" << v[0]
<< "\", \"" << v[1] << "\"\n";
}
반응형
'💻 programming > c++' 카테고리의 다른 글
[c++] any (0) | 2020.12.15 |
---|---|
[c++] optional (0) | 2020.12.15 |
[c++] perfect forwarding (완벽한 전달) (0) | 2020.12.15 |
[c++] async (0) | 2020.12.15 |
[c++] packaged task (0) | 2020.12.15 |
댓글