最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<regex>

# std::regex_iterator::コンストラクタ(C++11)

    regex_iterator();                                                                              // (1)

    regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
                   const regex_type& re,
                   regex_constants::match_flag_type m = regex_constants::match_default);           // (2)

    regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
                   const regex_type&& re,
                   regex_constants::match_flag_type m = regex_constants::match_default) = delete;  // (3) C++14 から

    regex_iterator(const regex_iterator&);                                                         // (4)

## 概要

`regex_iterator` オブジェクトを構築する

## 効果

- (1) デフォルトコンストラクタ。シーケンスの終端を示す特別なイテレータを構築する。
- (2) メンバ変数 `begin`、`end`、`pregex`、`flags` をそれぞれ `a`、`b`、`addressof(re)`、`m` で初期化して、`regex_search(begin, end, match, *pregex, flags)` を呼び出す。 検索に成功しなかった場合（`false` が返された場合）、デフォルトコンストラクタで構築した場合と同様、直ちにシーケンスの終端を示す特別なイテレータとなる。
- (3) deleted コンストラクタであるため、使用するとコンパイルエラーとなる。
- (4) コピーコンストラクタ。

## 備考

- メンバ変数 `begin`、`end`、`pregex`、`flags`、`match` はあくまでも説明用のプライベートメンバ変数であるため、注意すること。
- `regex_iterator` は指定された正規表現 `re` のコピーではなく、`re` へのポインタをオブジェクト内に保持するため、引数に渡した正規表現オブジェクトは当該イテレータを使用し終わるまで破棄されないようにする必要がある。
  従って、(2) の形式のコンストラクタに渡す引数 `re` に一時オブジェクトを指定することはほぼ間違いなくプログラミング上のエラーを意味する。
  (3) の形式のコンストラクタが C++14 で追加された理由は、この事態をコンパイル時に検出するためである。
  しかし、この追加のため、C++11 では適格となりうる以下のようなコードは C++14 ではコンパイルエラーになる。

      void f(std::sregex_iterator&&);

      f(std::sregex_iterator(s.begin(), s.end(), std::regex("\\d+")));

## 例

    #include <iostream>
    #include <iterator>
    #include <regex>
    #include <string>

    int main()
    {
      std::regex re("\\d+");
      std::string s("This compiler supports the C++11 standard.");
      std::sregex_iterator it(std::begin(s), std::end(s), re);
      if (it != std::sregex_iterator()) {
        std::cout << "match:" << it->str() << std::endl;
      } else {
        std::cout << "not match" << std::endl;
      }
    }

### 出力

    match:11

## バージョン

### 言語

- C++11（一部 C++14）

### 処理系

- Clang: 3.0 ✅, 3.1 ✅, 3.2 ✅, 3.3 ✅, 3.4 ✅, 3.5 ✅, 3.6 ✅
- GCC: 4.9.0 ✅, 4.9.1 ✅, 5.0.0 ✅
- ICC: ??
- Visual C++: ??

### 備考

- libstdc++ には 5.0.0 rev.218373 現在、(3) の形式のコンストラクタは存在しない。
- libc++ には、3.4 までは (3) の形式のコンストラクタは存在しない。
- libstdc++ では 5.0.0 rev.218373 現在、コピーコンストラクタで構築したオブジェクトの `match.position(i)` が補正されずに誤っている。（補正については `operator++` の「効果」を参照）

## 参照

- LWG Issue 3040. `basic_string_view::starts_with` Effects are incorrect