最終更新日時: 2026年01月31日 13時25分25秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<valarray>

# std::begin (非メンバ関数)(C++11)(C++26で削除)

    namespace std {
      template <class T>
      unspecified1 begin(valarray<T>& va);       // (1) C++11、C++26で削除

      template <class T>
      unspecified2 begin(const valarray<T>& va); // (2) C++11、C++26で削除
    }

この関数はC++26で削除された。代わりにメンバ関数版の`begin()`および、`<iterator>`ヘッダで定義される`std::begin()`関数を使用すること。

## 概要

先頭の要素を指すイテレータを取得する。

## 戻り値

先頭要素を指すイテレータを返す。この関数によって返されるイテレータは、ランダムアクセスイテレータの要件を満たす型である。

unspecified1は非`const`なランダムアクセスイテレータ、unspecified2は`const`なランダムアクセスイテレータである。

## 備考

- この関数によって返されるイテレータは、`resize()`メンバ関数が呼び出されると無効になる

- `valarray`オブジェクト同士の演算結果を型推論する場合 (`auto`、`decltype`、関数テンプレートなど)、以下のようなコードは実装によってコンパイルエラーになる可能性がある：

      std::valarray<double> a = {1.0, 2.0, 3.0};
      std::valarray<double> b = {1.0, 2.0, 3.0};
      auto c = a + b;

      // 以下の2行がコンパイルエラーになる可能性がある
      auto first = std::begin(c); // 変数cの型をautoではなく、
      auto last = std::end(c);    // std::valarray<double>にする必要がある

  これは、`std::valarray<T>` 型を返す関数（本リファレンスでは戻り値型を `ValOrProxy` と表記）は、式テンプレートによる最適化を考慮して、代理の型を返すことが許可されているが、`begin` と `end` はその代理の型を受け取りが可能であることを求められていないためである。
  `<valarray>` の概要も参照のこと。

## 例

    #include <iostream>
    #include <valarray>
    #include <algorithm>

    int main()
    {
      std::valarray<int> va = {1, 2, 3};

      std::for_each(std::begin(va), std::end(va), [](int x) {
        std::cout << x << std::endl;
      });
    }

### 出力

    1
    2
    3

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅
- GCC: 4.6.4 ✅
- ICC: ??
- Visual C++: ??

## 参照

- N2930 Range-Based For Loop Wording (Without Concepts)
- LWG2058. valarray and begin/end
- P3016R6 Resolve inconsistencies in `begin`/`end` for `valarray` and `braced-initializer-list`