본문 바로가기
💻 programming/c++

[c++] move

by 연구원-A 2020. 12. 15.
반응형

std::move

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

댓글