regex_token_iterator пытается сослаться на удаленную функцию - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь разбить строку с помощью регулярного выражения в C ++.Вот минимальное повторение:

#include <string>
#include <regex>

int main()
{
  std::string str("abc");
  std::string regex("b");
  std::regex_token_iterator<std::string::const_iterator> a(str.begin(), str.end(), std::regex(regex), -1);
}

Эта программа выдает мне ошибку компиляции: пытается сослаться на удаленную функцию

error C2280: 'std::regex_token_iterator<std::_String_const_iterator<std::_String_val<std::_Simple_types<_Ty>>>,char,std::regex_traits<char>>::regex_token_iterator(_BidIt,_BidIt,const std::basic_regex<char,std::regex_traits<char>> &&,int,std::regex_constants::match_flag_type)': attempting to reference a deleted function

Но я чувствую, чтонастроить его правильно.Почему я получаю эту ошибку и что мне нужно изменить, чтобы заставить ее компилироваться?

Я работал с this gist в качестве примера, но я не могу заставить ее скомпилироватьлибо.

Я создаю с помощью Microsoft Visual Studio 2017 15.8.4

1 Ответ

0 голосов
/ 02 декабря 2018

Конструктор, который принимает 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 итератора, но это приводит к неопределенному поведению .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...