Я на Visual Studio 2013, и я вижу, что я думаю, это ошибка, я надеялся, что кто-то сможет подтвердить это?Ошибка Visual Studio regex_iterator?
string foo{ "A\nB\rC\n\r" };
vector<string> bar;
for (sregex_iterator i(foo.cbegin(), foo.cend(), regex("(.*)[\n\r]{1,2}")); i != sregex_iterator(); ++i){
bar.push_back(i->operator[](1).str());
}
Этот код поражает Debug Утверждение в библиотеке Visual Studio регулярное выражение:
regex_iterator
сиротой
Если я определяю regex
вне for
-loop это прекрасно:
string foo{ "A\nB\rC\n\r" };
vector<string> bar;
regex bug("(.*)[\n\r]{1,2}");
for (sregex_iterator i(foo.cbegin(), foo.cend(), bug); i != sregex_iterator(); ++i){
bar.push_back(i->operator[](1).str());
}
В качестве альтернативы это работает отлично в преобразование, как показано в this question:
string foo{ "A\nB\rC\n\r" };
vector<string> bar;
// This puts {"A", "B", "C"} into bar
transform(sregex_iterator(foo.cbegin(), foo.cend(), regex("(.*)[\n\r]{1,2}")), sregex_iterator(), back_inserter(bar), [](const smatch& i){ return i[1].str(); });
Может кто-то подтвердить это ошибка?
Итак, что вы говорите, это тот факт, что он скомпилирован, является ошибкой? И факт, что я мог бы сделать заявление 'transform', - ошибка? –
@JonathanMee: тот факт, что он скомпилирован, означает, что VS 2013 в основном пытается реализовать C++ 11, а не C++ 14. Тот факт, что 'transform' работал, на самом деле не является ошибкой. Вы использовали временную информацию после ее уничтожения. Это неопределенное поведение, поэтому компилятор может сделать что-либо * и по-прежнему соответствовать стандарту. –
@JerryCoffin Интересно, я думаю, это проблема не в полной поддержке какого-либо стандарта. Я определенно предположил, что конструктор перемещения будет висеть на 'regex'. –