Я до сих пор не могу найти ничего, что говорит это явно, но если вы измените ключ [*], то, например, ваш компаратор не удовлетворяет требованиям 25.3 (строгий слабый порядок):
comp вызывает четко определенное отношение для классов эквивалентности, определяемых по эквиваленту
comp
, не является четко определенным отношением, если возвращает разные значения для одних и тех же входных данных в разное время.
В вашем случае я считаю, что можно изменить поля MyClass
, которые не участвуют в сравнении.
Интересно, что 23.1.2 / 2 гласит: «Каждый ассоциативный контейнерпараметризованный на ключе и отношение упорядочения Compare, которое вызывает строгую слабую упорядоченность (25.3) для элементов ключа ".Я думаю, мы можем принять это, чтобы означать, что компаратор вызывает строгое слабое упорядочение для Key
объектов , которые являются элементами контейнера , не обязательно для всех объектов типа Key
.Например, если Key является указателем, я уверен, что можно написать компаратор, который разыменовывает его, при условии, что вы не используете нулевой указатель в качестве ключа.По той же причине, я надеюсь, что мы можем изменить ключ, которого нет в контейнере.
[*] с помощью «изменить», я имею в виду сделать что-нибудь, что изменяет результаты компаратора с этим ключом и некоторымидругой ключ.В этом случае, конечно, вы на самом деле не модифицируете сам ключ (который является просто значением указателя), но я так его называю.