- utility[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp11[meta cpp]
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
}
- remove_reference[link /reference/type_traits/remove_reference.md]
左辺値を右辺値にキャストする。
この関数は、渡されたオブジェクトを右辺値参照にキャストし、ムーブセマンティクスを適用させる。
static_cast<typename std::remove_reference<T>::type &&>(t)
- std::remove_reference[link /reference/type_traits/remove_reference.md]
投げない
#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&&)が呼ばれる
}
- std::move[color ff0000]
copy
move
上記のa1
の初期化において、a
は左辺値なので、コンストラクタA(const A&)
が呼び出され、a1
はa
からコピーされる。a2
の初期化においては、std::move(a)
呼び出しのため、コンストラクタA(A&&)
が呼ばれ、a2
はa
からムーブされる。
- C++11
- Clang: ??
- GCC:
- GCC, C++11 mode: 4.6.1
- ICC: ??
- Visual C++: 2010, 2012, 2013, 2015