<utility> ヘッダで提供される std::move は、引数を右辺値参照型にstatic_castする関数である。 これにより、その値を「ムーブしてよいもの」として扱わせやすくなる。

ただし、std::move 自体が値を移動するわけではない。 実際にムーブが起こるかどうかは、その結果を受け取るムーブコンストラクタムーブ代入演算子(C++)などに依存する。

#include <iostream>
#include <string>
#include <utility> // for std::move
 
template <typename T>
void mySwapMove(T& a, T& b)
{
    T tmp{ std::move(a) }; // ムーブコンストラクタが使われることがある
    a = std::move(b);      // ムーブ代入演算子が使われることがある
    b = std::move(tmp);    // ムーブ代入演算子が使われることがある
}
 
int main()
{
    std::string x{ "abc" };
    std::string y{ "de" };
 
    std::cout << "x: " << x << '\n';
    std::cout << "y: " << y << '\n';
 
    mySwapMove(x, y);
 
    std::cout << "x: " << x << '\n';
    std::cout << "y: " << y << '\n';
 
    return 0;
}

関連