В приведенном ниже примере кода перегруженный оператор< не был квалифицирован как const, и компилируется в Visual C ++ (все версии до 2013 Preview), но в Clang выдает ошибку — примечание: функция-кандидат недопустима: этот аргумент имеет тип «const Entry», но метод не отмечен оператор const bool<(const Entry& Другой ).
#include "stdafx.h"#include <vector>
#include <algorithm>
struct Entry
{
unsigned int age;
bool operator<( const Entry& other ) // !!! no const qualification here !!!
{
return age < other.age;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<Entry> entries;
for( unsigned int i = 0; i < 100; ++i )
{
Entry entry;
entry.age = i;
entries.push_back( entry );
}
// Sort by age
std::sort( entries.begin(), entries.end() );
return 0;
}
Является ли Visual C ++ нестандартным стандартом для обеспечения константности операторов сравнения / реляции? Или это как-то связано с std :: sort?
Стандарт C ++ гласит, что предполагается, что неконстантная функция не будет применяться через разыменованные итераторы, во-первых, указав ее в терминах Compare
функтор, который можно передать sort
:
Compare
тип объекта функции (20.8) Возвращаемое значение операции вызова функции, примененной к объекту
типаCompare
когда контекстно конвертируется в bool (4), возвращает true, если первый аргумент вызова
меньше второго и ложь в противном случае.Compare
comp
используется повсеместно для алгоритмов, предполагающих
отношение заказа. Предполагается, чтоcomp
не будет применять какие-либо непостоянные функции через разыменованный
итератор.
(акцент мой)
а затем, установив связь между Compare
а также operator<
:
Для всех алгоритмов, которые принимают
Compare
есть версия, которая используетoperator<
вместо. То есть,comp(*i,
по умолчанию
*j) != false*i < *j != false
, Для работы алгоритмов, отличных от описанных в 25.4.3
правильно,comp
должен вызывать строгий слабый порядок значений.
Обе цитаты из. От 25.4 Сортировка и связанные с ней операции.
Таким образом, хотя это прямо не указано, что член operator<
должен быть const
, предположение, что это означает, что это должно быть. Не имеет смысла устанавливать ограничения на comp
и не на operator<
,
Я бы сказал, что здесь виноват Visual C ++, поскольку он позволяет вызывать неконстантные функции для разыменованных итераторов.
Других решений пока нет …