Мы много раз были укушены следующей ошибкой:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(int* pn) { cout << *pn << " "; }
int main() {
int* n1 = new int(1);
int* n2 = new int(2);
int* n3 = new int(3);
vector<int*> v;
v.push_back(n1);
v.push_back(n2);
v.push_back(n3);
sort(v.begin(), v.end()); // Here be dragons!
for_each(v.begin(), v.end(), print);
cout << endl;
delete n1; delete n2; delete n3;
}
Проблема в том, что std:: sort сравнивает целые указатели, а не целые числа, что не то, что планировал программист. Хуже того, вывод может выглядеть корректным и детерминированным (рассмотрите порядок адресов, возвращаемых новыми или выделенных в стеке). Корневая проблема заключается в том, что сорт в конечном итоге вызывает оператор < для T, что редко бывает хорошей идеей, когда T - тип указателя.
Есть ли способ предотвратить это или, по крайней мере, получить предупреждение о компиляторе? Например, существует ли способ создать пользовательскую версию std:: sort, для которой требуется функция сравнения, когда T является указателем?