Я хотел бы расширить мой комментарий сверху:
вам не обязательно знать, как на самом деле работает специализация std :: less для указателей. Важно то, что он там и делает правильные вещи
Я не хотел подразумевать, что ваш вопрос не заслуживает ответа, а скорее это то, что стандарт C ++ определяет :
Для шаблонов less, more, less_equal и more_equal специализации для любого типа указателя дают результат, соответствующий строгому общему порядку, определенному реализацией указателей ([defns.order.ptr ]). [... Примечание ...]
Для специализаций шаблонов less, more, less_equal и more_equal, если оператор вызова вызывает встроенный оператор, сравнивающий указатели, оператор вызова выдает результат, соответствующий реализации -определенный строгий общий порядок по указателям.
Стандарт не упоминает, как реализуются специализации std::less
(или других сравнений) для указателей. Это только указывает, что их «оператор вызова выдает результат, совместимый с определенным реализацией строгим общим порядком по указателям». Для этого реализации не всегда могут использовать встроенный оператор <
, потому что [expr.rel # 4] :
Определен результат сравнения неравных указателей на объекты с точки зрения частичного порядка, соответствующего следующим правилам:
(4.1) Если два указателя указывают на разные элементы одного и того же массива или его подобъектов, указатель на элемент с более высоким индексом требуется для сравните больше.
(4.2) Если два указателя указывают на разные нестатические c элементы данных одного и того же объекта или на подобъекты таких элементов, рекурсивно, указатель на объявленный позже элемент требуется для сравните больше, если два члена имеют одинаковый контроль доступа ([class.access]), ни один из них не является подобъектом нулевого размера, а их класс не является объединением.
(4.3) В противном случае ни один указатель не является требуется сравнивать больше, чем другие.
То есть: указатели, которые не являются указателями на один и тот же массив или указатели подобъектам одного и того же объекта нельзя переносимо сравнить со встроенным <
.
Я не знаю, как less<string*>
объект библиотечной функции гарантирует сравнение, хотя применяется только <
в аргументы типа элемента ?!
Это не так. Вернее, это не обязательно. Ваш компилятор знает, может ли в целевой архитектуре <
использоваться для произвольных указателей, но в общем случае это не так.
В его примере nameTable;
это вектор указателей на -строки, таким образом, они являются смежными в памяти, так как это может быть неопределенным при использовании <
в сортировке, но "четко определенным" при использовании std::less<string*>
?
Это небольшое недоразумение. Действительно, std::vector
хранит свой элемент в смежной памяти, но указатели, которые вы храните в векторе, могут указывать куда угодно. Следовательно, они не являются ни указателями на элементы одного и того же массива, ни указателями на подобъекты одного и того же объекта. Ваш аргумент был бы верен, если бы у вас было std::vector<string>
и вы хотите сравнить указатели с элементами в этом контейнере, но это не то, что вы делаете здесь.