<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;
}