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 < 0significa en este contexto?
En la página de documentación , creo que mi caso es 16) y < nullptrdónde 0está nullptr.
Pero, ¿qué hace?

p==-1hay un identificador no válido. Dado que2^64es un número ridículamente enorme, cualquier sentidopes siempre positivo. Por lo tanto,p<0busca 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
0consideradonullptrpor 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.0anullptr, 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 = nullptrEstá mal formado.std::nullptr_tfue 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
0convierte 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-1valor de puntero).fuente
false. Está definido por la implementación o no está especificado (no estoy seguro). Pero estoy de acuerdo en que probablemente regresefalseen 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::lesses un functor de orden estricto) ( demo ).fuente
false. Si lo hace está definido por la implementación o no especificado. Probablemente siempre regresefalseen la mayoría de las implementaciones actuales (¿todas?).std::lessretornofalse.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.