J'ai affaire à du code qui n'a pas été écrit par moi. J'ai cette déclaration:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
Alors qu'est-ce que cela p < 0
signifie dans ce contexte?
Sur la page de documentation , je pense que mon cas est 16) y < nullptr
, où 0
est nullptr
.
Mais qu'est-ce que ça fait?
p==-1
est un handle non valide. Puisqu'il2^64
s'agit d'un nombre ridiculement énorme, tout sensiblep
est toujours positif.p<0
Vérifie donc le descripteur non valide de WINAPI. Ce n'est pas un bon code.uint8_t*
(ou même tableau deuint8_t
)? Je pense que ouivoid*
, n'est-ce pas?void*
ils ont la macro HANDLE_PTR ou quelque chose qui est fondamentalementlong*
iirc.Réponses:
Il correspond à la surcharge (11) sur cppreference
operator<(const unique_ptr&, nullptr_t);
. 0 se convertit implicitement enstd::nullptr_t
. Selon la documentation, le résultat eststd::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)
.Le résultat est défini par l'implémentation, mais inconditionnellement faux sur probablement la plupart des systèmes. Vraisemblablement sur un système exotique où null n'a pas la représentation binaire de 0, le résultat pourrait être vrai.
(16) est le même inverse:
0 > unique_ptr
. Le résultat est le même.la source
0
considérénullptr
par le compilateur? Je pense que c'est ce qu'il se demande. Ça n'a pas de sens pour moi non plus, du moins.nullptr
(ou dépend de ce que vous entendez par considération). 0 se convertit implicitement enstd::nullptr_t
.0
tonullptr
, car je n'ai vu que les deux compatibles avec les comparaisons booléennes. Ils sont comparables, mais j'avais l'impression qu'ils ne sont pas convertibles.int x = nullptr
est mal formé.std::nullptr_t
été conçu pour être utilisable avec n'importe quelle constante de pointeur nul; pas seulementnullptr
. 0 (ainsi que 0L par exemple) sont des constantes de pointeur nul, il est donc prévu qu'elles puissent être utilisées pour créer unstd::nullptr_t
.Vérifiez que ce
operator <
n'est pas surchargé quelque part dans votre base de code. Cela semble être le seul moyen(p < 0)
possibletrue
.Exemple:
Tirages:
démo en direct
Sinon, comme d'autres l'ont dit,
0
convertit implicitement enstd::nullptr_t
, ce qui sélectionnerait labool operator<(const unique_ptr<T, D>& x, nullptr_t)
surcharge qui appelleraitstd::less(p, 0)
qui retourneraitfalse
(même sur Windows avec une-1
valeur de pointeur).la source
false
. Il est défini par l'implémentation ou non spécifié (je ne suis pas sûr.) Mais je suis d'accord qu'il reviendra probablementfalse
sur la plupart (toutes?) Les implémentations. Voir aussi la réponse de @eerorikaCette expression correspond à cet opérateur de modèle (0 en cours de conversion
nullptr
):Cela renvoie
std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)
ce qui est toujours faux (commestd::less
c'est un foncteur d'ordre strict) ( démo ).la source
false
. Que ce soit le cas est défini par l'implémentation ou non spécifié. Il revient probablement toujoursfalse
sur la plupart (toutes?) Des implémentations actuelles.std::less
retourfalse
.false
. La raison pratique serait que la valeur du pointeur zéro est représentée par l'adresse la plus basse possible ou quelque chose le long de ces lignes.