最終更新日時(UTC): 2025年07月11日 17時16分44秒
Koichi Murase が更新

履歴 編集

function template
<utility>

# std::move (utility)(C++11)

    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&&)が呼ばれる
    }

### 出力

    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 ✅

## 参照

- C++11 右辺値参照・ムーブセマンティクス
- N1377 A Proposal to Add Move Semantics Support to the C++ Language
- N1690 A Proposal to Add an Rvalue Reference to the C++ Language
- N1385 The Forwarding Problem: Arguments
- N2027 A Brief Introduction to Rvalue References
- N3471 Constexpr Library Additions: utilities, v3