unique_ptr <0 ИЛИ что делает меньше, чем оператор? - PullRequest
9 голосов
/ 15 января 2020

Я имею дело с кодом, который был написан не мной. У меня есть следующее утверждение:

// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }

Так что же означает p < 0 в этом контексте?
На странице документации , я считаю, что мой случай 16) y < nullptr, где 0 - это nullptr.

Но что это делает?

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Убедитесь, что operator < не перегружен где-то в вашей базе кода. Кажется, это единственный способ, которым (p < 0) может быть true.

Пример:

bool operator< (const std::unique_ptr<uint8_t[]>&, int) { return true; }

int main() {
    std::unique_ptr<uint8_t[]> p;
    std::cout << (p < 0) << std::endl;
}

Отпечатки:

1

живая демонстрация

В противном случае, как уже говорили другие, 0 неявно преобразуется в std::nullptr_t, что выберет перегрузку bool operator<(const unique_ptr<T, D>& x, nullptr_t), которая вызовет std::less(p, 0), который вернет false (даже на * 1023) * со значением указателя -1).

2 голосов
/ 15 января 2020

unique_ptr <0 ИЛИ что делает меньше, чем оператор? </p>

Соответствует перегрузке (11) для cppreference operator<(const unique_ptr&, nullptr_t);. 0 неявно преобразуется в std::nullptr_t. Согласно документации, результат равен std::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr).

. Результат определяется реализацией, но безусловно ложен на большинстве систем. Предположительно в системе exoti c, где null не имеет двоичного представления 0, результат может быть истинным.

Я считаю, что мой случай равен 16)

(16) так же наоборот: 0 > unique_ptr. Результат тот же.

0 голосов
/ 15 января 2020

Это выражение соответствует этому оператору шаблона (0 преобразуется в nullptr):

template <class T, class D>
bool operator<(const unique_ptr<T, D>& x, nullptr_t);

Возвращает std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr), что всегда ложно (как std::less - функтор строгого порядка) ( demo ).

...