Im Artikel zur Härtung der Standardbibliothek haben wir gesehen, dass viele Anforderungen der Bibliothek als "Contracts" formuliert sind. Dieser Beitrag untersucht Contracts in C++26 und wie sie auf den eigenen Code angewendet werden können.
Die Diskussion beginnt mit einem einfachen Beispiel: eine Funktion, die einen Wert aus einem std::vector an einem bestimmten Index zurückgibt. Traditionell wird die Anforderung, dass der Index gültig ist, mit assert im Funktionskörper durchgesetzt. Dieser Ansatz hat Nachteile. Die Anforderung steckt in der Implementierung, sodass jemand, der nur die Deklaration liest, einen vector und einen Index sieht, ohne den Zusammenhang zwischen beiden. Assertions werden außerdem nur über NDEBUG gesteuert, das die Prüfung bei Definition vollständig entfernt.
C++26-Contracts, eingeführt durch P2900, verschieben die Anforderung in die Funktionssignatur, mit einer pre(...)-Klausel nach der Parameterliste. Diese Vorbedingung beschreibt eine Bedingung, die beim Eintritt in die Funktion erwartet wird. Dieselbe Anforderung kann auch in der Deklaration auftauchen und ist damit für jeden sichtbar, der die API liest. Contracts bieten mehrere Auswertungssemantiken, etwa das Ignorieren einer Prüfung, das Melden einer Verletzung mit anschließendem Fortfahren oder das Beenden des Programms. Welche verfügbar sind und wie sie ausgewählt werden, bestimmt die Compiler-Implementierung.
Contracts unterscheiden außerdem zwischen dem, was der Aufrufer bereitstellen muss, und dem, was die Funktion zurückzugeben verspricht. Nachbedingungen, eingeführt mit post, formulieren diese Zusagen, ohne vor jeder return-Anweisung manuelle Prüfungen zu erfordern. Dadurch sind Contracts auch dann zur Dokumentation von APIs nützlich, wenn die Laufzeitprüfung deaktiviert ist.
Der Artikel schließt mit einem vollständigen Beispiel für eine Vorbedingung ab und behandelt weitere Themen wie Nachbedingungen, die Platzierung von Contracts an Deklarationen und Definitionen, Compiler-Optionen sowie Details, die Entwickler überraschen können.
Quelle: Hacker News · Zusammengefasst von HeadlinesBriefing