This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++14 status.

### 2332. `regex_iterator/regex_token_iterator` should forbid temporary regexes

Section: 30.11 [re.iter] Status: C++14 Submitter: Stephan T. Lavavej Opened: 2013-09-21 Last modified: 2016-01-28

Priority: 2

View all issues with C++14 status.

Discussion:

Users can write "`for(sregex_iterator i(s.begin(), s.end(), regex("meow")), end; i != end; ++i)`", binding a temporary `regex` to `const regex&` and storing a pointer to it. This will compile silently, triggering undefined behavior at runtime. We now have the technology to prevent this from compiling, like how `reference_wrapper` refuses to bind to temporaries.

[2014-02-14 Issaquah meeting: Move to Immediate]

Proposed resolution:

This wording is relative to N3691.

1. Change 30.11.1 [re.regiter]/1, class template `regex_iterator` synopsis, as indicated:

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

2. Change 30.11.2 [re.tokiter]/6, class template `regex_token_iterator` synopsis, as indicated:

   >     regex_token_iterator();
   >     regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
   >                          const regex_type& re,
   >                          int submatch = 0,
   >                          regex_constants::match_flag_type m =
   >                            regex_constants::match_default);
   >     regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
   >                          const regex_type& re,
   >                          const std::vector<int>& submatches,
   >                          regex_constants::match_flag_type m =
   >                            regex_constants::match_default);
   >     regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
   >                          const regex_type& re,
   >                          initializer_list<int> submatches,
   >                          regex_constants::match_flag_type m =
   >                            regex_constants::match_default);
   >     template <std::size_t N>
   >     regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
   >                          const regex_type& re,
   >                          const int (&submatches)[N],
   >                          regex_constants::match_flag_type m =
   >                            regex_constants::match_default);
   >     regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
   >                          const regex_type&& re,
   >                          int submatch = 0,
   >                          regex_constants::match_flag_type m =
   >                            regex_constants::match_default) = delete;
   >     regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
   >                          const regex_type&& re,
   >                          const std::vector<int>& submatches,
   >                          regex_constants::match_flag_type m =
   >                            regex_constants::match_default) = delete;
   >     regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
   >                          const regex_type&& re,
   >                          initializer_list<int> submatches,
   >                          regex_constants::match_flag_type m =
   >                            regex_constants::match_default) = delete;
   >     template <std::size_t N>
   >     regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
   >                          const regex_type&& re,
   >                          const int (&submatches)[N],
   >                          regex_constants::match_flag_type m =
   >                            regex_constants::match_default) = delete;