Visual Studio regex_iterator Fehler?

8

Ich bin auf Visual Studio 2013 und ich sehe, was ich denke, ist ein Fehler, ich hatte gehofft, dass jemand bestätigen könnte?

%Vor%

Dieser Code trifft auf eine Debug-Assertion in der Visual Studio-Regex-Bibliothek:

  

regex_iterator verwaist

Wenn ich regex außerhalb des for -loop definiere, ist das in Ordnung:

%Vor%

Alternativ funktioniert das auch in einer Transformation, die in dieser Frage angezeigt wird:

%Vor%

Kann jemand bestätigen, dass dies ein Fehler ist?

    
Jonathan Mee 27.04.2015, 12:26
quelle

2 Antworten

10

In C ++ 11 dürfen Sie ein temporäres regex an const regex & binden, was zu einem nicht definierten Verhalten führen kann, wenn der Iterator außerhalb der Lebensdauer des temporären Objekts verwendet wird, da ein Zeiger darauf gespeichert wird. Dies ist ein Fehler in der Spezifikation und es ist kein Fehler, obwohl Visual Studio dies mit einer Debug-Assert abfängt.

%Vor%

Die folgende gelöschte Überladung fügte C ++ 14 hinzu, um diesen Fall von cppreference :

%Vor%

und es sagt:

  

Die Überladung 2 darf nicht mit einem temporären Regex aufgerufen werden,   da der zurückgegebene Iterator sofort ungültig wird.

Das ist also kein Visual Studio Bug, da es den C ++ 11 Standard implementiert und dies erst später durch einen Fehlerbericht behoben wurde. Sowohl clang als auch gcc mit -std=c++14 oder größer erzeugen einen Fehler mit Ihrer ersten ( Live-Anzeige ) und drittens ( live sehen ). Visual Studio unterstützt nur einige C ++ 14 in VS 2015 :

  

[...] und erste Unterstützung für bestimmte C ++ 14 Features. [...]

Wir können sehen, dass LWG-Fehler 2332: regex_iterator / regex_token_iterator sollte verbieten Temporary Regexes befasst sich damit:

  

Benutzer können schreiben "für (sreex_iterator i (s.begin (), s.end (),   Regex ("Miau")), Ende; ich! = Ende; ++ i) ", binden Sie einen temporären Regex an   const Regex & amp; und Speichern eines Zeigers darauf. Dies wird automatisch kompiliert,   Auslösen von undefiniertem Verhalten zur Laufzeit. Wir haben jetzt die Technologie   um zu verhindern, dass das kompiliert wird, wie es reference_wrapper ablehnt   Binde an Provisorien.

als T.C. weist darauf hin, dass das letzte Beispiel, das Sie zeigen, eigentlich in Ordnung ist, obwohl Sie eine temporäre binden, erstreckt sich ihre Lebensdauer bis zum Ende des Ausdrucks.

    
Shafik Yaghmour 27.04.2015, 12:32
quelle
2

Nein, das ist kein Fehler. Siehe LWG 2329 regex_match () / regex_search () mit match_results sollte temporäre Strings verbieten . Dieses Konstrukt weist ein undefiniertes Verhalten auf, da es einen temporären Regex an const regex & amp; und speichert einen Zeiger darauf.

Siehe auch C ++ 14 STL-Funktionen, Korrekturen und Änderungen in Visual Studio 14 CTP1 , wo dies als Fix aufgeführt ist.

    
Marius Bancila 27.04.2015 12:37
quelle