Estoy tratando con un código que no ha sido escrito por mí. Tengo esta afirmación:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
Entonces, ¿qué p < 0
significa en este contexto?
En la página de documentación , creo que mi caso es 16) y < nullptr
dónde 0
está nullptr
.
Pero, ¿qué hace?
p==-1
hay un identificador no válido. Dado que2^64
es un número ridículamente enorme, cualquier sentidop
es siempre positivo. Por lo tanto,p<0
busca un identificador no válido de WINAPI. Este no es un buen código.uint8_t*
(o incluso de matrizuint8_t
)? Creo que lo sonvoid*
, ¿no es así?void*
, tienen macro HANDLE_PTR o algo que es básicamentelong*
iirc.Respuestas:
Coincide con la sobrecarga (11) en cppreference
operator<(const unique_ptr&, nullptr_t);
. 0 se convierte implícitamente enstd::nullptr_t
. Según la documentación, el resultado esstd::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)
.El resultado es una implementación definida, pero incondicionalmente falsa en probablemente la mayoría de los sistemas. Presumiblemente en un sistema exótico donde nulo no tiene la representación binaria de 0, el resultado podría ser cierto.
(16) es la misma otra alrededor manera:
0 > unique_ptr
. El resultado es el mismo.fuente
0
consideradonullptr
por el compilador? Creo que eso es lo que se pregunta. Tampoco tiene sentido para mí, al menos.nullptr
(o depende de lo que quiere decir por consideración). 0 se convierte implícitamente enstd::nullptr_t
.0
anullptr
, ya que solo he visto los dos compatibles con las comparaciones booleanas. Son comparables, pero tenía la impresión de que no son convertibles.int x = nullptr
Está mal formado.std::nullptr_t
fue diseñado para ser utilizable con cualquier puntero nulo constante; no sólonullptr
. 0 (así como 0L, por ejemplo) son constantes de puntero nulo, por lo que es la intención de que puedan usarse para crear astd::nullptr_t
.Verifique que
operator <
no esté sobrecargado en algún lugar de su base de código. Esa parece ser la única forma en que(p < 0)
podría sertrue
.Ejemplo:
Huellas dactilares:
demo en vivo
De lo contrario, como han dicho otros, se
0
convierte implícitamente enstd::nullptr_t
, que seleccionaría labool operator<(const unique_ptr<T, D>& x, nullptr_t)
sobrecarga que llamaría a lastd::less(p, 0)
que volveríafalse
(incluso en Windows con un-1
valor de puntero).fuente
false
. Está definido por la implementación o no está especificado (no estoy seguro). Pero estoy de acuerdo en que probablemente regresefalse
en la mayoría de las implementaciones (¿todas?). Ver también la respuesta de @eerorikaEsta expresión coincide con este operador de plantilla (0 se convierte a
nullptr
):Esto devuelve lo
std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)
que siempre es falso (comostd::less
es un functor de orden estricto) ( demo ).fuente
false
. Si lo hace está definido por la implementación o no especificado. Probablemente siempre regresefalse
en la mayoría de las implementaciones actuales (¿todas?).std::less
retornofalse
.false
. La razón práctica sería que el valor del puntero cero está representado por la dirección más baja posible o algo por el estilo.