Стандартные библиотечные функциональные объекты и несвязанное сравнение указателей - PullRequest
0 голосов
/ 25 апреля 2020

Я сталкивался с этим во время прохождения C ++ Primer 5-е издание

Стандартная библиотека определяет набор классов, представляющих арифметические c, реляционные и логические операторы .

Одним из важных аспектов этих объектов библиотечных функций является , что библиотека гарантирует, что они будут работать для указателей . Напомним, что сравнение двух не связанных между собой указателей не определено (п. 3.5.3, с. 120). Тем не менее, мы можем отсортировать вектор указателей по их адресам в памяти. Хотя для нас было бы неопределенным делать это напрямую, мы можем сделать это через один из объектов библиотечной функции:

Я не могу не задаться вопросом, как от него избавиться неопределенное поведение? Я думаю, что, возможно, приведение к какому-либо типу, достаточно большому, чтобы содержать адрес, затем сравнить. Или здесь что-то еще играет?

1 Ответ

0 голосов
/ 25 апреля 2020

Вы не можете сравнивать несвязанные указатели напрямую, но вы можете привести их к достаточно длинному целому типу без знака и сравнить результаты. Все нормально. Пример из G CC

  template<typename _Tp>
    struct less<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
    {
      _GLIBCXX14_CONSTEXPR bool
      operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
      {
#if __cplusplus >= 201402L
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
    if (__builtin_is_constant_evaluated())
#else
    if (__builtin_constant_p(__x < __y))
#endif
      return __x < __y;
#endif
    return (__UINTPTR_TYPE__)__x < (__UINTPTR_TYPE__)__y;
      }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...