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:
- Implementieren Sie und testen Sie die ganze Sache.
- Schreiben Sie einen Vorschlag, der überzeugend argumentiert, dass dies umsetzbar und für die Kunden wertvoll ist.
- Nehmen Sie an Normungssitzungen teil, präsentieren Sie diesen Vorschlag und überzeugen Sie sich.
- 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.
- 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.
- 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.