Почему это работает? std :: set find с ключом поиска и настраиваемым компаратором

Я не понимаю, почему работает следующее (хотя я рад, что это работает!):

Я могу определить std :: set Объектов с настраиваемым компаратором. Этот настраиваемый компаратор работает, сравнивая некоторые переменные-члены двух сравниваемых объектов. НО , тогда я могу использовать функцию set .find (x) , где x относится к типу переменной-члена, а не к объекту сам, и все работает!

Вот чрезвычайно упрощенный пример:

my_class.h

class my_class   //just hold an integer
{
    public:
      int an_int;

    my_class(int new_int) : an_int(new_int)
    { }


    //compare instances of this class by comparing their integers...
    struct compare_instances   
    {    
      bool operator() (const my_class &a, const my_class &b) const
      {
        return a.an_int < b.an_int;
      }
    };
};

main.cpp:

...
std::set<my_class, my_class::compare_instances> my_class_set;
my_class_set.insert( my_class(18) );
my_class_set.insert( my_class(7)  );
my_class_set.insert( my_class(22) );

std::set<my_class, my_class::compare_instances>::const_iterator found_it
                  = my_class_set.find(18);
 std::fprintf(stderr, "found_it->an_int = %d\n", found_it->an_int); 

Вывод: "found_it-> an_int = 18" !!!!!!

Я ожидал, что приведенный выше код не будет компилироваться, и компилятор закричит мне, что « 18 не относится к типу my_class ». Но это не так ...

Разве аргументы .find не должны быть того же типа, что и элементы самого набора ? Это то, о чем, кажется, говорится в документации ...

6
задан cmo 29 February 2012 в 18:53
поделиться