Ich habe es mit Code zu tun, der nicht von mir geschrieben wurde. Ich habe diese Aussage:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
Was bedeutet p < 0
das in diesem Zusammenhang?
Auf der Dokumentationsseite glaube ich, dass mein Fall ist 16) y < nullptr
, wo 0
ist nullptr
.
Aber was macht es?
p==-1
ist ein ungültiges Handle. Da2^64
es sich um eine lächerlich große Zahl handelt, ist jeder vernünftigep
immer positiv.p<0
Überprüft also , ob das WINAPI-Handle ungültig ist. Das ist kein guter Code.uint8_t*
(oder sogar ein Array vonuint8_t
)? Ich denke sie sind esvoid*
, nicht wahr?void*
sie haben Makro HANDLE_PTR oder etwas, das im Grundelong*
iirc ist.Antworten:
Es entspricht der Überlastung (11) der Referenz
operator<(const unique_ptr&, nullptr_t);
. 0 konvertiert implizit instd::nullptr_t
. Laut Dokumentation ist das Ergebnisstd::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)
.Das Ergebnis ist eine definierte Implementierung, die auf den meisten Systemen jedoch unbedingt falsch ist. Vermutlich auf einem exotischen System, auf dem null nicht die binäre Darstellung von 0 hat, könnte das Ergebnis wahr sein.
(16) ist umgekehrt umgekehrt :
0 > unique_ptr
. Das Ergebnis ist das gleiche.quelle
0
berücksichtigtnullptr
? Ich denke, das wundert er sich. Das ergibt zumindest für mich keinen Sinn.nullptr
(oder hängt davon ab, was Sie unter Berücksichtigung verstehen). 0 konvertiert implizit instd::nullptr_t
.0
in gibtnullptr
, da ich nur die beiden gesehen habe, die mit booleschen Vergleichen kompatibel sind. Sie sind vergleichbar, aber ich hatte den Eindruck, dass sie nicht konvertierbar sind.int x = nullptr
ist schlecht geformt.std::nullptr_t
wurde so konzipiert, dass es mit jeder Nullzeigerkonstante verwendet werden kann. nicht nurnullptr
. 0 (wie auch 0L zum Beispiel) sind Nullzeigerkonstanten, daher ist beabsichtigt, dass sie zum Erstellen von a verwendet werden könnenstd::nullptr_t
.Stellen Sie sicher, dass
operator <
irgendwo in Ihrer Codebasis keine Überlastung vorliegt. Das scheint der einzige Weg zu sein, wie es sein(p < 0)
könntetrue
.Beispiel:
Drucke:
Live-Demo
Andernfalls wird, wie andere gesagt haben,
0
implizit in konvertiertstd::nullptr_t
, wodurch diebool operator<(const unique_ptr<T, D>& x, nullptr_t)
Überladung ausgewählt wird, die aufgerufen wird undstd::less(p, 0)
die zurückkehrtfalse
(selbst unter Windows mit einem-1
Zeigerwert).quelle
false
. Es ist entweder implementierungsdefiniert oder nicht spezifiziert (ich bin nicht sicher). Aber ich stimme zu, dass es wahrscheinlichfalse
bei den meisten (allen?) Implementierungen zurückkehren wird. Siehe auch Antwort von @eerorikaDieser Ausdruck stimmt mit diesem Vorlagenoperator überein (0 wird konvertiert in
nullptr
):Dies gibt zurück,
std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)
was immer falsch ist (wiestd::less
es ein strenger Ordnungsfunktor ist) ( Demo ).quelle
false
. Ob dies der Fall ist, ist entweder implementierungsdefiniert oder nicht spezifiziert. Bei denfalse
meisten (allen?) Aktuellen Implementierungen wird es jedoch wahrscheinlich immer wieder angezeigt.std::less
Rückgabefalse
.false
. Der praktische Grund wäre, dass der Nullzeigerwert durch die niedrigstmögliche Adresse oder etwas in dieser Richtung dargestellt wird.