Estou lidando com código que não foi escrito por mim. Eu tenho esta afirmação:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
Então, o que p < 0
significa nesse contexto?
Na página de documentação , acredito que meu caso é 16) y < nullptr
, onde 0
está nullptr
.
mas o que isso faz?
p==-1
é um identificador inválido. Como2^64
é um número ridiculamente grande, qualquer sensívelp
é sempre positivo. Portanto,p<0
verifica se há identificador inválido do WINAPI. Este não é um bom código.uint8_t*
(ou mesmo matriz deuint8_t
)? Eu acho que eles sãovoid*
, não são?void*
eles têm macro HANDLE_PTR ou algo que é basicamentelong*
IIRC.Respostas:
Corresponde à sobrecarga (11) na preferência
operator<(const unique_ptr&, nullptr_t);
. 0 converte implicitamente emstd::nullptr_t
. Conforme a documentação, o resultado éstd::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)
.O resultado é uma implementação definida, mas incondicionalmente falsa provavelmente na maioria dos sistemas. Presumivelmente, em um sistema exótico em que null não tem a representação binária de 0, o resultado pode ser verdadeiro.
(16) é o mesmo em torno de outra maneira:
0 > unique_ptr
. O resultado é o mesmo.fonte
0
consideradonullptr
pelo compilador? Eu acho que é isso que ele está se perguntando. Também não faz sentido para mim.nullptr
(ou depende do que você entende por consideração). 0 converte implicitamente emstd::nullptr_t
.0
paranullptr
, já que eu só vi as duas compatíveis com comparações booleanas. São comparáveis, mas fiquei com a impressão de que não são conversíveis.int x = nullptr
está mal formado.std::nullptr_t
foi projetado para ser utilizável com qualquer constante de ponteiro nulo; não apenasnullptr
. 0 (assim como 0L, por exemplo) são constantes de ponteiro nulo; portanto, é intenção que elas possam ser usadas para criar astd::nullptr_t
.Verifique
operator <
se não está sobrecarregado em algum lugar da sua base de código. Essa parece ser a única maneira de como(p < 0)
poderia sertrue
.Exemplo:
Impressões:
demonstração ao vivo
Caso contrário, como outros já disseram,
0
converte implicitamente emstd::nullptr_t
, o que selecionaria abool operator<(const unique_ptr<T, D>& x, nullptr_t)
sobrecarga que chamariastd::less(p, 0)
que retornariafalse
(mesmo no Windows com um-1
valor de ponteiro).fonte
false
. É definido pela implementação ou não especificado (não tenho certeza.) Mas concordo que provavelmente retornaráfalse
na maioria das implementações (todas?). Veja também a resposta de @eerorikaEssa expressão corresponde ao operador do modelo (0 sendo convertido em
nullptr
):Retorna o
std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)
que é sempre falso (comostd::less
é um functor de ordem estrita) ( demo ).fonte
false
. Se isso ocorre, é definido ou não da implementação. Ele provavelmente sempre retornafalse
na maioria das implementações atuais (todas?).std::less
retornofalse
.false
. A razão prática seria que o valor do ponteiro zero é representado pelo endereço mais baixo possível ou algo nesse sentido.