Apakah salah satu operator‹(HANDLE, HANDLE) atau std::less‹HANDLE› terdefinisi dengan baik?

Saya ingin menggunakan Windows HANDLE (pegangan utas) sebagai kunci di std::map. Untuk ini, saya memerlukan operator kurang dari yang terdefinisi dengan baik untuk tipe HANDLE.

Jenis penunjuk T* dapat digunakan sebagai kunci untuk std::map hanya jika pembanding std::less<T*> ditentukan, karena operator<(T*, T*) bawaan (dan selanjutnya std::less<>) tidak memberikan urutan total.

Dari segi implementasi, kita tahu bahwa HANDLE sebenarnya diketik sebagai tipe penunjuk. Oleh karena itu, std::less<HANDLE> sepertinya taruhan yang aman. Tapi saya menganggapnya hanya detail implementasi yang HANDLE diimplementasikan sebagai tipe pointer. (Dan dengan memeriksa nilai HANDLE aktual di debugger, terlihat jelas bahwa nilai tersebut bukan nilai penunjuk asli.)

Apakah ada jaminan formal yang dapat diperoleh dari standar C++ dan dokumentasi Windows API yang memungkinkan saya menggunakan HANDLE sebagai kunci di std::map?


person j6t    schedule 27.02.2020    source sumber
comment
Yang penting adalah tipe, bukan nilai sebenarnya. A HANDLE benar-benar bertipe void*. Jika ada total pesanan untuk void*, maka Anda dapat menggunakannya sebagai kunci di std::map. Perlu diingat, bahwa pegangan thread dapat digunakan kembali setelah objek thread dibuang.   -  person IInspectable    schedule 27.02.2020
comment
@IInspectable Bisakah Anda mengutip dokumentasi yang menyatakan bahwa HANDLE adalah tipe pointer?   -  person j6t    schedule 27.02.2020
comment
Jenis Data Windows.   -  person IInspectable    schedule 27.02.2020
comment
Mengenai karena operator<(T*, T*) bawaan (dan selanjutnya std::less<>) tidak memberikan pesanan total. JADI: Kurang universal‹› untuk petunjuk dalam standar C++ Ini tentang C++03 tetapi saya benar-benar ingin tahu apakah fitur/persyaratan berguna seperti itu telah dihapus dari standar yang lebih baru... ;-)   -  person Scheff's Cat    schedule 27.02.2020
comment
@Scheff - Spoiler: ini berlaku untuk setiap versi C++ sejak itu.   -  person StoryTeller - Unslander Monica    schedule 27.02.2020
comment
@j6t: Dapatkah Anda mengutip dokumentasi yang menyatakan bahwa HANDLE adalah tipe penunjuk? Bisakah Anda mengutip dokumentasi yang menyatakan bahwa HANDLE memiliki urutan, bukan sekadar dapat menguji kesetaraannya? Karena menurut saya, dengan ingin mendeteksi pesanan sama sekali, Anda sudah mengandalkan cara HANDLE diimplementasikan secara spesifik.   -  person Nicol Bolas    schedule 27.02.2020
comment
@NicolBolas Karena HANDLE didokumentasikan sebagai void*, maka tersirat perintah. Ya, pelaksana membatasi diri mereka pada implementasi tertentu (dan menjamin properti---seperti perintah---yang seharusnya tidak diperlukan) dengan mendokumentasikannya secara publik, tapi itu bukan masalah saya;) Sebaliknya, itu sangat berguna.   -  person j6t    schedule 27.02.2020
comment
@j6t: Jadi jika didokumentasikan sebagai void*, dan diwajibkan oleh standar C++ agar pointer memiliki urutan total yang dapat diakses melalui std::less... apa masalah Anda? Berapa banyak lagi jaminan formal yang Anda perlukan?   -  person Nicol Bolas    schedule 27.02.2020
comment
@NicolBolas Hanya itu jaminan yang saya inginkan. Bukankah aku sudah mengatakannya...?   -  person j6t    schedule 27.02.2020