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&
:
nullptr
? -JRebindable? -NeiKann anstelle von etwas anderem als Zeigern verwendet werden? -Neistd::reference_wrapper<T>
:
nullptr
? -JRebindable? -JKann anstelle von etwas anderem als Zeigern verwendet werden? -Neigsl::not_null<T*>
:
nullptr
? -JRebindable? -JKann anstelle von etwas anderem als Zeigern verwendet werden? -JNun 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.