2014-03-27 18 views
5

ich auf dieses Problem versucht, ein Atom time_point zu halten, siehe (Atom erfordert noexcept Standardkonstruktors wenn Standardkonstruktor verfügbar): http://cplusplus.github.io/LWG/lwg-active.html#2165Sollen Konstruktoren auf std :: chrono :: ... :: time_point noexcept sein? (? Oder warum sind sie nicht)

Das einfache Problem std ist: : atomic oder ähnlich wird nicht unter der aktuellen Std kompilieren.

In Anbetracht der std :: chrono :: clock_type :: now() s sind noexcept. Es scheint seltsam, dass die Zeitpunkte selbst nicht sind.

Antwort

5

Meiner bescheidenen Meinung nach sollten sie bedingtnoexcept sein. Um den korrekten Zustand zu beschreiben, müssen wir die Konstruktoren von duration sichern und diskutieren.

Zuerst die speziellen Konstruktoren: Standard und Kopie.

Diese Konstruktoren werden korrekt mit = default angegeben. Das heißt, wenn der zugrunde liegende rep spezielle noexcept Konstruktoren hat, dann wird die duration auch. Genau das wollen wir. Jetzt

was:

template <class Rep2> 
    constexpr explicit duration(const Rep2& r); 
template <class Rep2, class Period2> 
    constexpr duration(const duration<Rep2, Period2>& d); 

Dies sind derzeit nicht noexcept, aber wir möchten für sie sein, wenn die Konstruktionen, die sie sind noexcept nennen. Zum Beispiel:

template <class Rep2> 
    constexpr explicit duration(const Rep2& r) 
     noexcept(is_nothrow_constructible<rep, Rep2 const&>{}); 
template <class Rep2, class Period2> 
    constexpr duration(const duration<Rep2, Period2>& d) 
     noexcept(noexcept(is_nothrow_copy_constructible<rep>{}) && 
       noexcept(std::chrono::duration_cast<duration>(d))); 

Dies bedeutet, dass sie nicht für die üblichen Anwendungsfälle gelten. Wenn Sie jedoch einen Rep erstellen, der ein arithmetischer Emulator ist, der (zum Beispiel) einen Überlauf auslösen könnte, dann sind diese Konstruktoren nicht korrekt noexcept.

Um diese Konstrukteure tatsächlich funktionieren, die Member-Funktion machen count() bedingt noexcept sein muss, und die Funktion duration_cast bedingt noexcept gemacht werden muss.

Jetzt (und nur jetzt) ​​kann man beginnen, die time_point Konstruktoren mit ähnlicher Strenge zu bekämpfen.

Das ist alles machbar. Ich habe es nur als Prototyp erstellt, um zu bestätigen, dass ich in dieser Antwort tatsächlich gute Informationen gebe. Um dies jedoch alles Standard zu machen, muss man:

  1. Implementieren Sie und testen Sie die ganze Sache.
  2. Schreiben Sie einen Vorschlag, der überzeugend argumentiert, dass dies umsetzbar und für die Kunden wertvoll ist.
  3. Nehmen Sie an Normungssitzungen teil, präsentieren Sie diesen Vorschlag und überzeugen Sie sich.
  4. Wenn das Komitee Löcher in Ihrem Argument findet (und sie werden), reparieren Sie die Implementierung, korrigieren Sie das Angebot und gehen Sie zurück zu Schritt 3.
  5. Fahren Sie mit den Schritten 3 und 4 fort, bis das Komitee so krank ist Sie, dass sie nachgeben und stimmen Sie in einen Entwurf Standard.
  6. Warten Sie, bis der Entwurf zu einem offiziellen Standard geworden ist, und schützen Sie den Vorschlag davor, während des Wartens aus dem Standard abgewählt zu werden.

Bis heute hat das Komitee die Bedingung noexcept auf Funktionen sehr sparsam angewendet.

Die Antwort auf die Frage im Titel ist einfach:

Niemand diese Arbeit alle in es gesetzt. Allerdings würde ich Menschen ermutigen, dies zu tun. Ich glaube, das würde den Kunden von <chrono> nützen.

Verwandte Themen