В настоящее время я работаю над созданием приложения C ++ для компиляции как в Windows, так и в Linux, во время отладки я обнаружил, что
std::this_thread::get_id().hash()
не компилируется в Linux с gcc 4.8 (благодаря комментариям в этом нить). Предлагаемое исправление для этого было использовать:
std::hash<std::thread::id>()(std::this_thread::get_id())
Кто-нибудь знает, производят ли они тот же результат?
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()
то же самое, или вы можете подмести свой платформо-зависимый модуль. Я бы пошел с уборщицей сам.