std :: future nach dem Aufruf von get () immer noch gültig (was eine Ausnahme auslöst)

8

Nach cppreference , nach dem Aufruf von std::future::get :

  

valid () ist nach einem Aufruf dieser Methode falsch.

Zusätzlich von cplusplus.com :

  

Sobald der gemeinsame Status bereit ist, hebt die Funktion auf und gibt (oder löst) den freigegebenen Zustand frei. Dies macht das zukünftige Objekt nicht mehr gültig: Diese Memberfunktion soll höchstens einmal für jeden zukünftigen gemeinsamen Zustand aufgerufen werden.

Und unter Ausnahmesicherheit :

  

Die Funktion löst die Ausnahme aus, die im freigegebenen Zustand gespeichert ist, wenn der Provider sie bereit macht, indem sie sie auf eine Ausnahme setzt. Beachten Sie, dass in diesem Fall eine Basisgarantie angeboten wird, wobei das zukünftige Objekt so modifiziert wird, dass es keine gültige Zukunft mehr ist (was selbst für diesen Objekt ein gültiger Status ist, trotz seines Namens).

Keine Beschreibung unterscheidet zwischen einem Aufruf von get , der einen Wert zurückgibt, und einem Wert, der eine Ausnahme bezüglich der Ungültigkeitserklärung des zukünftigen Objekts auslöst.

Das beschriebene Verhalten ist jedoch nicht das, was ich in diesem Beispielcode sehe:

%Vor%

Die Ausgabe, die ich sehe, ist:

%Vor%

Ich benutze Visual Studio Premium 2013, Version 12.0.30501.00 Update 2. Ist das ein Fehler mit dem Compiler oder, richtiges Verhalten im Falle einer Ausnahme? Ich konnte keine Fehlerberichte diesbezüglich finden und war mir nicht sicher, ob das Verhalten erwartet wurde.

Bearbeiten - & lt; Zukunft & gt; Implementierungsuntersuchung

Wenn Sie ein wenig in die std::future Implementierung eintauchen, wird das _Associated_state Objekt als _Retrieved = true; AFTER markiert und die zugehörige Ausnahme (falls vorhanden) geworfen:

%Vor%

Meine Vermutung ist, dass die Ausnahmeprüfung und _Retrieved = true; ausgetauscht werden sollten - das Objekt sollte sofort als abgerufen (nach dem _Get_only_once check) gesetzt werden und dann sollte alle andere Logik folgen. Ergo, Compiler Bug.

Bearbeiten - Problemumgehung

Ich denke, das Folgende sollte ausreichen, um get direkt aufzurufen, bis ein Fix implementiert wurde:

%Vor%     
AlphaXerion 24.11.2015, 17:02
quelle

1 Antwort

3

Ich habe unter Linux mit gcc 5.2.0 und clang 3.7.0 kompiliert - beides mal mit 64 Bit. Das Ausführen des Programms führt immer zu

%Vor%

Es sieht so aus, als würde Visual 2013 das falsch behandeln. Siehe auch:

C ++ §30.6.6 / 16-17

  

Auslöser: die gespeicherte Ausnahme, wenn eine Ausnahme im freigegebenen Zustand gespeichert wurde.

     

Nachbedingung: valid() == false .

Die Nachbedingung wird nach den Würfen erwähnt und muss daher immer gehalten werden, selbst wenn eine Ausnahme ausgelöst wird. Zumindest ist das meine Interpretation, obwohl ich nicht Standardis spreche.

Ich denke, Sie sollten wahrscheinlich auch mit Visual Studio 2015 versuchen und einen Fehler melden, wenn dieser die gleiche Handhabung zeigt.

    
mfuchs 24.11.2015, 18:05
quelle

Tags und Links