Да, GCC 4.8 поддерживает большую часть C ++ 11, что можно увидеть здесь .Тем не менее, это, кажется, ошибка в GCC 4.8.Точные требования std::sort
приведены в разделе 25.4 этой спецификации ISO от 2013 года.
Там отмечается, что единственным требованием к operator<
является то, что он реализует " строгий слабый порядок".Затем он продолжает определять «строгий слабый порядок» по своим математическим свойствам.Ничто из этого не подразумевает, что operator<
должен быть константным, как пытался заставить GCC 4.8.operator<
может, возможно, изменить внутреннюю переменную и все еще следовать спецификации, если возвращаемые логические значения делают "строгий слабый порядок".Это может быть использовано для подсчета количества сравнений, выполненных для каждой переменной с помощью функции std::sort
, что позволяет упростить сравнение std::sort
, не вдаваясь в неопределенное поведение (как только один пример множества различных возможностей).
Использование const должно было быть чрезмерным допущением относительно исходной реализации C ++ 11 в GCC 4.8 и было исправлено в более поздних версиях.
К сожалению, если онлайновый судья использует эту версию GCC, вы можетеничего не поделать.Другие ответы здесь определяют, как это исправить (а именно, сделать вашу функцию-член постоянной).
Копаясь в истории GCC, мы видим, что она была изменена здесь , 2013-09-27.Это выглядело как более крупный рефакторинг, который, возможно, не обратил внимания на тонкости, но вкладчик действительно удалил const
в нескольких областях, так что это казалось преднамеренным.Сообщение коммита также не слишком поучительно.Если вы хотите, вы можете написать ему, посмотреть, помнит ли он xD