Конструктор, который принимает regex
как временный объект, удаляется, потому что итератор не делает копию regex
, но сохраняет ссылку на этот объект.Эта удаленная функция должна предотвращать передачу временных значений в итератор .Если вы передадите временный объект в итератор, вы получите висячую ссылку.
Согласно ссылка :
regex_token_iterator( BidirectionalIterator a, BidirectionalIterator b,
const regex_type&& re,
int submatch = 0,
std::regex_constants::match_flag_type m =
std::regex_constants::match_default ) = delete;
, так что вам нужно создать регулярное выражение как L-значение объект:
std::string str("abc");
std::string regex("b");
std::regex r(regex);
std::regex_token_iterator<std::string::const_iterator> a(
str.begin(), str.end(), r, -1);
Что касается размещенной вами ссылки, удаленная перегрузка, которая ссылается на R-значение, была введена с C ++ 14, в C ++ 11 существует перегрузкачто занимает const regex_type& re
- поэтому временный объект регулярного выражения может быть передан в ctor итератора, но это приводит к неопределенному поведению .