Стандарт немного неясен в этом, но [alg.sorting]
дает два намека на то, почему этот отказ от компиляции может быть стандартно-совместимым поведением. Первый - [alg.sorting]/2
:
... Предполагается, что
blockquote>comp
не будет применять какую-либо непостоянную функцию через разыменованный итератор.Далее нам сообщают, что когда компаратор не поставляется
[alg.sorting]/3
:...
blockquote>comp(*i, *j) != false
по умолчанию*i < *j != false
, поскольку в ваш случай,
comp
по умолчанию*i < *j != false
, и это применит неконстантную функцию к разыменованным итераторам. Это делает недействительным предположение, данное в[alg.sorting]/2
, и поэтому ваш код имеет неопределенное поведение. Это законно для кода с неопределенным поведением, чтобы не компилировать.