namespace std {
template <class T>
typename remove_reference<T>::type&& move(T&& t) noexcept; // C++11
template <class T>
constexpr typename remove_reference<T>::type&& move(T&& t) noexcept; // C++14
}
概要
左辺値を右辺値にキャストする。
この関数は、渡されたオブジェクトを右辺値参照にキャストし、ムーブセマンティクスを適用させる。
戻り値
static_cast<typename std::remove_reference<T>::type &&>(t)
例外
投げない
例
#include <iostream>
#include <utility>
struct A {
A() {}
// 左辺値からコピー
A(const A&)
{
std::cout << "copy" << std::endl;
}
// 右辺値からムーブ
A(A &&)
{
std::cout << "move" << std::endl;
}
};
int main()
{
A a;
A a1 = a; // A(const A&)が呼ばれる
A a2 = std::move(a); // A(A&&)が呼ばれる
}
26
A a1 = a; // A(const A&)が呼ばれる
#include <iostream>
#include <utility>
struct A {
A() {}
// 左辺値からコピー
A(const A&)
{
std::cout << "copy" << std::endl;
}
// 右辺値からムーブ
A(A &&)
{
std::cout << "move" << std::endl;
}
};
出力
copy
move
上記のa1
の初期化において、a
は左辺値なので、コンストラクタA(const A&)
が呼び出され、a1
はa
からコピーされる。a2
の初期化においては、std::move(a)
呼び出しのため、コンストラクタA(A&&)
が呼ばれ、a2
はa
からムーブされる。
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.6.1 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅