Перегрузка констант в реляционных операторах Visual C ++ (с std :: sort)

В приведенном ниже примере кода перегруженный оператор< не был квалифицирован как 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?

3

Решение

Стандарт 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 ++, поскольку он позволяет вызывать неконстантные функции для разыменованных итераторов.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector