Использование std:: hash<std:: thread:: id>() (std:: this_thread:: get_id ())

В настоящее время я работаю над созданием приложения C++ для компиляции как в Windows, так и в Linux, во время отладки я обнаружил, что

std::this_thread::get_id().hash()

не компилируется в Linux с gcc 4.8 (благодаря комментариям в этой теме). Предлагаемое исправление для этого было использовать:

std::hash<std::thread::id>()(std::this_thread::get_id())

Кто-нибудь знает, производят ли они тот же результат?

2 ответа

Решение

GCC имеет право отклонить код. Стандарт не определяет члена hash за std::thread::id, С ++11, 30.3.1.1:

namespace std {
  class thread::id {
  public:
    id() noexcept;
  };

  bool operator==(thread::id x, thread::id y) noexcept;
  bool operator!=(thread::id x, thread::id y) noexcept;
  bool operator<(thread::id x, thread::id y) noexcept;
  bool operator<=(thread::id x, thread::id y) noexcept;
  bool operator>(thread::id x, thread::id y) noexcept;
  bool operator>=(thread::id x, thread::id y) noexcept;

  template<class charT, class traits>
    basic_ostream<charT, traits>&
      operator<< (basic_ostream<charT, traits>& out, thread::id id);

  // Hash support
  template <class T> struct hash;
  template <> struct hash<thread::id>;
}

Итак, используя std::hash<std::thread::id>()(std::this_thread::get_id()) безусловно, является действительным (фактически единственным действительным) способом получения хэша идентификатора потока.

std::thread::id::hash() насколько я могу судить, не в стандарте. Так что, возможно, это расширение или реализация. Таким образом, его поведение, очевидно, будет определяться реализацией.

std::hash<std::thread::id>()(std::this_thread::get_id()) находится в стандарте.

Поскольку вы не можете иметь поток в более чем одной системе, вы не можете .hash() быть вызванным в любом переносимом коде, остается возможность того, что какой-то модуль для конкретной платформы использует .hash(), ваш общий код с помощью std::hash, Вы можете положиться на здравомыслие и предположить, что .hash() то же самое, или вы можете подмести свой платформо-зависимый модуль. Я бы пошел с уборщицей сам.

Другие вопросы по тегам