Jestem na Visual Studio 2013 i widzę, co myślę, że jest błąd, miałem nadzieję, że ktoś może potwierdzić?Błąd 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());
}
Kod ten uderza Debug twierdzenie w Visual biblioteki Studio regex:
regex_iterator
osierocony
Gdybym określić regex
poza for
-loop jest w porządku:
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());
}
Ewentualnie to działa prawidłowo w transformacji, jak pokazano na 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(); });
Czy ktoś może potwierdzić, że jest to błąd?
Więc to, co mówisz, to fakt, że skompilowany jest błąd? A fakt, że mogłem wykonać wyrażenie 'transform' jest błędem? –
@ JonathanMee: fakt, że został skompilowany oznacza, że VS 2013 w większości próbuje zaimplementować C++ 11, a nie C++ 14. Fakt, że "transformacja" zadziałała, nie jest tak naprawdę błędem. Użyłeś tymczasowego po zniszczeniu. To jest niezdefiniowane zachowanie, więc kompilator może wykonać * cokolwiek * i nadal zachowuje zgodność ze standardem. –
@JerryCoffin Interesujące Myślę, że to jest problem z niezupełnym wsparciem dla żadnego standardu. Z pewnością założyłem, że konstruktor ruchu będzie wisiał na 'regex'. –