gsl :: not_null <T *> vs. std :: reference_wrapper <T> vs. T &

C ++ Core Guidelines wurde kürzlich vorgestellt (Glückwunsch!) und ich mache mir Sorgen umgsl::not_null Art. Wie angegeben in I.12: Deklarieren Sie einen Zeiger, der nicht null sein darf, alsnot_null:

Um zu vermeiden, dass nullptr-Fehler dereferenziert werden. So verbessern Sie die Leistung, indem Sie redundante Prüfungen auf nullptr vermeiden.

...

urch Angabe der Absicht in der Quelle können Implementierer und Tools eine bessere Diagnose bereitstellen, z. B. das Auffinden einiger Fehlerklassen durch statische Analyse, und Optimierungen durchführen, z. B. das Entfernen von Verzweigungen und Nulltest

Die Absicht ist klar. Wir haben jedoch bereits eine Sprachfunktion dafür. Zeiger, die nicht null sein dürfen, werden als Referenzen bezeichnet. Und obwohl Referenzen nach ihrer Erstellung nicht erneut gebunden werden können, wird dieses Problem durch @ gelösstd::reference_wrapper.

Der Hauptunterschied zwischengsl::not_null undstd::reference_wrapper Ich sehe darin, dass das letztere nur anstelle von Zeigern verwendet werden kann, während das erstere auf irgendetwas funktioniertnullptr -zuweisbar (Zitat von F.17: Verwenden Sie not_null, um anzugeben, dass "null" kein gültiger Wert ist):

not_null ist nicht nur für eingebaute Zeiger. Es funktioniert fürarray_view, string_view, unique_ptr, shared_ptr und andere zeigerähnliche Typen.

Ich stelle mir die Feature-Vergleichstabelle folgendermaßen vor:

T&:

Kann nicht speichernnullptr? -JRebindable? -NeiKann anstelle von etwas anderem als Zeigern verwendet werden? -Nei

std::reference_wrapper<T>:

Kann nicht speichernnullptr? -JRebindable? -JKann anstelle von etwas anderem als Zeigern verwendet werden? -Nei

gsl::not_null<T*>:

Kann nicht speichernnullptr? -JRebindable? -JKann anstelle von etwas anderem als Zeigern verwendet werden? -J

Nun hier sind endlich die Fragen:

Ist mein Verständnis der Unterschiede zwischen diesen Konzepten korrekt? Bedeutet das, dassstd::reference_wrapper ist jetzt unbrauchbar?

PS Ich habe Tags erstelltcpp-core-guidelines undguideline-support-library dafür hoffe ich richtig.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage