Sono su Visual Studio 2013 e sto vedendo quello che penso sia un bug, speravo che qualcuno potesse confermare?Visual Studio regex_iterator Bug?
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());
}
Questo codice colpisce un'Asserzione di debug nella libreria Visual Studio espressioni regolari:
regex_iterator
orfani
Se io definisco il regex
al di fuori del for
-loop va bene:
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());
}
In alternativa Questo funziona bene in una trasformazione, come mostrato in 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(); });
Qualcuno può confermare questo è un bug?
Quindi quello che stai dicendo è che il fatto che sia compilato è un bug? E il fatto che potrei fare l'istruzione 'transform' è un bug? –
@JonathanMee: il fatto che sia compilato significa che VS 2013 cerca principalmente di implementare C++ 11, non C++ 14. Il fatto che il 'transform' abbia funzionato non è in realtà un bug. Hai usato un temporaneo dopo che è stato distrutto. Questo è un comportamento indefinito, quindi il compilatore può fare * qualsiasi cosa * e comunque essere conforme allo standard. –
@JerryCoffin Suppongo che questo sia il problema con il non supportare totalmente uno standard. Avevo certamente pensato che il costruttore delle mosse si sarebbe aggrappato alla "regex". –