Я имею дело с кодом, который был написан не мной. У меня есть это утверждение:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
Так что же p < 0
значит в этом контексте?
На странице документации , я считаю, что мой случай 16) y < nullptr
, где0
находится nullptr
.
Но что это делает?
p==-1
есть неверный дескриптор. Поскольку2^64
это смешно огромное число, любое разумноеp
всегда положительно. Так чтоp<0
проверяет недействительный дескриптор WINAPI. Это не хороший код.uint8_t*
(или даже массивuint8_t
)? Я так думаюvoid*
, не так ли?void*
имеют макроса HANDLE_PTR или чего-то, что в основном являетсяlong*
iirc.Ответы:
Это соответствует перегрузке (11) на cppreference
operator<(const unique_ptr&, nullptr_t);
. 0 неявно преобразуется вstd::nullptr_t
. Согласно документации, результат естьstd::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)
.Результат определяется реализацией, но безусловно ложен на большинстве систем. Предположительно в экзотической системе, где null не имеет двоичного представления 0, результат может быть истинным.
(16) такой же , наоборот:
0 > unique_ptr
. Результат тот же.источник
0
считается лиnullptr
это компилятором? Я думаю, это то, что ему интересно. По крайней мере, для меня это тоже не имеет смысла.nullptr
(или зависит от того, что вы подразумеваете под рассмотрением). 0 неявно преобразуется вstd::nullptr_t
.0
вnullptr
, поскольку я видел только два из них, совместимых с логическими сравнениями. Они сопоставимы, но у меня сложилось впечатление, что они не конвертируемые.int x = nullptr
плохо сформирован.std::nullptr_t
был разработан для использования с любой константой нулевого указателя; не простоnullptr
. 0 (как и 0L, например) являются константами нулевого указателя, поэтому предполагается, что они могут быть использованы для созданияstd::nullptr_t
.Убедитесь, что
operator <
не перегружен где-то в вашей кодовой базе. Это , кажется, единственный способ , как(p < 0)
может бытьtrue
.Пример:
Печать:
живое демо
В противном случае, как уже говорили другие,
0
неявно преобразуется вstd::nullptr_t
, что выберетbool operator<(const unique_ptr<T, D>& x, nullptr_t)
перегрузку, которая вызовет,std::less(p, 0)
который будет возвращатьсяfalse
(даже в Windows со-1
значением указателя).источник
false
. Он либо определяется реализацией, либо не указывается (я не уверен.) Но я согласен, что он, вероятно, вернетсяfalse
в большинстве (всех?) Реализаций. Смотрите также ответ @eerorikaЭто выражение совпадает с этим оператором шаблона (0 преобразуется в
nullptr
):Это возвращает,
std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)
что всегда ложно (какstd::less
функтор строгого порядка) ( демо ).источник
false
. Является ли это определенным для реализации или неопределенным. Вероятно, он всегда возвращается,false
хотя в большинстве (всех?) Текущих реализаций.std::less
возвратаfalse
.false
. Практическая причина заключается в том, что нулевое значение указателя представлено наименьшим возможным адресом или чем-то в этом направлении.