Mam do czynienia z kodem, który nie został napisany przeze mnie. Mam to oświadczenie:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
Co więc p < 0
oznacza w tym kontekście?
Na stronie z dokumentacją uważam, że mój przypadek dotyczy tego 16) y < nullptr
, gdzie 0
jest nullptr
.
Ale co to robi?
p==-1
jest niepoprawny uchwyt. Ponieważ2^64
jest to absurdalnie duża liczba, każdy rozsądnyp
jest zawsze pozytywny.p<0
Sprawdza więc nieprawidłowy uchwyt WINAPI. To nie jest dobry kod.uint8_t*
(a nawet tablicyuint8_t
)? Myślę, że sąvoid*
, prawda?void*
mają makra HANDLE_PTR lub coś, co jest w zasadzielong*
iirc.Odpowiedzi:
Odpowiada przeciążeniu (11) na preferencjach cp
operator<(const unique_ptr&, nullptr_t);
. 0 domyślnie konwertuje nastd::nullptr_t
. Zgodnie z dokumentacją wynik jest następującystd::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)
.Wynikiem jest implementacja zdefiniowana, ale bezwarunkowo fałszywa w prawdopodobnie większości systemów. Prawdopodobnie w egzotycznym systemie, w którym null nie ma binarnej reprezentacji 0, wynik może być prawdziwy.
(16) jest taka sama odwrót:
0 > unique_ptr
. Wynik jest taki sam.źródło
0
branynullptr
pod uwagę przez kompilator? Myślę, że to właśnie on się zastanawia. Przynajmniej dla mnie to nie ma sensu.nullptr
(lub zależy od tego, co rozumiesz przez rozważanie). 0 domyślnie konwertuje nastd::nullptr_t
.0
nanullptr
, ponieważ widziałem tylko te dwie kompatybilne z porównaniami boolowskimi. Są porównywalne, ale miałem wrażenie, że nie można ich zamienić.int x = nullptr
jest źle sformowany.std::nullptr_t
został zaprojektowany do pracy z dowolną stałą zerową wskaźnika; nie tylkonullptr
. 0 (na przykład 0L) są stałymi wskaźnikami zerowymi, więc intencją jest, aby można je było użyć do utworzeniastd::nullptr_t
.Sprawdź,
operator <
czy nie jest przeciążony gdzieś w bazie kodu. To chyba jedyny sposób, w jaki(p < 0)
może byćtrue
.Przykład:
Wydruki:
demo na żywo
W przeciwnym razie, jak powiedzieli inni,
0
niejawnie konwertuje nastd::nullptr_t
, który wybierzebool operator<(const unique_ptr<T, D>& x, nullptr_t)
przeciążenie, które wywoła,std::less(p, 0)
które zwrócifalse
(nawet w systemie Windows z-1
wartością wskaźnika).źródło
false
. Jest to albo implementacja zdefiniowana, albo nieokreślona (nie jestem pewien.) Ale zgadzam się, że prawdopodobnie wrócifalse
do większości (wszystkich?) Implementacji. Zobacz także odpowiedź @eerorikaTo wyrażenie pasuje do tego operatora szablonu (0 jest konwertowane na
nullptr
):Zwraca
std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)
to zawsze fałsz (podobnie jakstd::less
funktor ścisłego rzędu) ( demo ).źródło
false
. To, czy tak jest, jest zdefiniowane w implementacji lub nieokreślone. Prawdopodobnie zawsze powracafalse
w przypadku większości (wszystkich?) Bieżących implementacji.std::less
zwrotufalse
.false
. Praktycznym powodem byłoby to, że zerowa wartość wskaźnika jest reprezentowana przez najniższy możliwy adres lub coś wzdłuż tych linii.