Хорошо ли определен один из операторов ‹(HANDLE, HANDLE) или std :: less ‹HANDLE›?

Я хочу использовать Windows HANDLE (дескриптор потока) в качестве ключа в std::map. Для этого мне нужен оператор «меньше», который четко определен для типа HANDLE.

Типы указателей T* могут использоваться в качестве ключей для std::map, только если указан компаратор std::less<T*>, потому что встроенный operator<(T*, T*) (и в дальнейшем std::less<>) не обеспечивает общий порядок.

С точки зрения реализации мы знаем, что HANDLE фактически определяется как тип указателя. Таким образом, std::less<HANDLE> выглядит беспроигрышным вариантом. Но я считаю лишь деталь реализации, что HANDLE реализован как тип указателя. (И, проверив фактические значения HANDLE в отладчике, можно ясно увидеть, что они не являются подлинными значениями указателя.)

Существуют ли какие-либо формальные гарантии, вытекающие из стандарта C ++ и документации Windows API, которые позволили бы мне использовать HANDLE в качестве ключа в std::map?


person j6t    schedule 27.02.2020    source источник
comment
Важен тип, а не фактическое значение. HANDLE действительно относится к типу void*. Если для void* существует общий заказ, вы можете использовать его как ключ в std::map. Имейте в виду, что дескрипторы потока действительно используются повторно после удаления объекта потока.   -  person IInspectable    schedule 27.02.2020
comment
@IInspectable Можете ли вы процитировать документацию, в которой говорится, что HANDLE является типом указателя?   -  person j6t    schedule 27.02.2020
comment
Типы данных Windows.   -  person IInspectable    schedule 27.02.2020
comment
Относительно , потому что встроенный operator<(T*, T*) (и в дальнейшем std::less<>) не обеспечивает полного порядка. SO: Универсальный меньше ‹› для указателей в стандарте C ++ Речь идет о C ++ 03, но мне действительно интересно, была ли удалена такая полезная функция / требование из более поздних стандартов ... ;-)   -  person Scheff's Cat    schedule 27.02.2020
comment
@Scheff - Спойлер: с тех пор это верно для каждой версии C ++.   -  person StoryTeller - Unslander Monica    schedule 27.02.2020
comment
@ j6t: Можете ли вы процитировать документацию, в которой говорится, что HANDLE является типом указателя? Можете ли вы процитировать документацию, в которой говорится, что HANDLE имеют порядок, а не просто возможность проверить их на равенство? Потому что мне кажется, что, желая обнаружить порядок вообще, вы уже полагаетесь на особенности реализации HANDLE.   -  person Nicol Bolas    schedule 27.02.2020
comment
@NicolBolas Поскольку HANDLE задокументировано как void*, подразумевается порядок. Да, разработчики ограничивают себя определенной реализацией (и поэтому гарантируют свойства --- такие как порядок --- которые в противном случае не понадобились бы), публично документируя это, но это не моя проблема;) Напротив, это очень полезно.   -  person j6t    schedule 27.02.2020
comment
@ j6t: Итак, если это задокументировано как void*, а стандарт C ++ требует, чтобы указатели имели общий порядок, доступный через _2 _... в чем ваша проблема? Сколько еще официальных гарантий вам нужно?   -  person Nicol Bolas    schedule 27.02.2020
comment
@NicolBolas Это все, что мне нужно. Разве я не сказал это уже ...?   -  person j6t    schedule 27.02.2020