最終更新日時(UTC): 2026年02月17日 14時22分33秒
Akira Takahashi が更新

履歴 編集

function
<forward_list>

# std::forward_list::operator=(C++11)

    forward_list& operator=(const forward_list& x);           // (1) C++11
    constexpr forward_list& operator=(const forward_list& x); // (1) C++26

    forward_list& operator=(forward_list&& x);                       // (2) C++11
    forward_list& operator=(forward_list&& x)
      noexcept(allocator_traits<Allocator>::is_always_equal::value); // (2) C++17
    constexpr forward_list& operator=(forward_list&& x)
      noexcept(allocator_traits<Allocator>::is_always_equal::value); // (2) C++26

    forward_list& operator=(initializer_list<T>);           // (3) C++11
    constexpr forward_list& operator=(initializer_list<T>); // (3) C++26

## 概要

- (1) : コピー代入
- (2) : ムーブ代入
- (3) : 初期化子リストの代入

## 効果

- (1) : 同じテンプレートパラメータを持つ`forward_list`クラスのオブジェクトをコピー代入する。`*this`の全ての要素が解放され、`x`の全ての要素が`*this`にコピーされる。
- (2) : 同じテンプレートパラメータを持つ`forward_list`クラスのオブジェクトをムーブ代入する。`*this`の全ての要素が解放され、`x`の全ての要素が`*this`にムーブされる。
- (3) : 同じテンプレートパラメータを持つ`initializer_list`クラスのオブジェクトをコピー代入する。`*this`の全ての要素が解放され、`x`の全ての要素が`*this`にコピーされる。

## 戻り値

`*this`

## 事後条件

- (1) : `*this == x`
- (2) : `*this`は元々の`x`と等値となる
- (3) : `*this == x`

## 計算量

- (1) : 全要素のデストラクタ呼び出しとコピーを行うために、線形時間
- (2) : 全要素のデストラクタ呼び出しをするために、線形時間
- (3) : 全要素のデストラクタ呼び出しとコピーを行うために、線形時間

## 例

    #include <cassert>
    #include <forward_list>
    #include <algorithm>

    int main()
    {
      // コピー代入
      {
        std::forward_list<int> ls1 = {1, 2, 3};
        std::forward_list<int> ls2;

        ls2 = ls1;

        assert(ls1 == ls2);
      }

      // ムーブ代入
      {
        std::forward_list<int> ls1 = {1, 2, 3};
        std::forward_list<int> ls2;

        ls2 = std::forward_list<int>(ls1);

        assert(ls1 == ls2);
      }

      // 初期化子リストからのコピー代入
      {
        std::forward_list<int> ls1;
        ls1 = {1, 2, 3};

        // 事後条件の検証:
        std::initializer_list<int> init = {1, 2, 3};
        std::forward_list<int> ls2;
        ls2 = init;

        assert(std::equal(ls2.begin(), ls2.end(), init.begin()));
      }
    }

### 出力

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅, 2017 ✅
  - (3) `initializer_list`のオーバーロードは2013から。

## 参照

- N2679 Initializer Lists for Standard Containers(Revision 1)
  - (3)の経緯となる提案文書
- N4258 Cleaning-up noexcept in the Library, Rev 3
  - `noexcept` 追加の経緯となる提案文書
- P3372R3 constexpr containers and adaptors