Важным моментом здесь является то, что разрешение перегрузки выполняется только на основе аргументов функции, а не результата.В вашем конкретном случае у вас есть две разные перегрузки, и разница в том, что неявная this
постоянна в одной из них, эта перегрузка будет срабатывать всякий раз, когда статический тип объекта или ссылки, для которой вызывается метод, постоянен.
Если вы хотите принудительно настроить диспетчеризацию на постоянную перегрузку, вы можете получить константную ссылку и затем вызвать эту ссылку:
btree<char> const & r = myTree;
btree<char>::const_iterator it = r.find('M');
Вам следует избегать этой конструкции в реальном коде, даже если выиспользуйте его для тестирования.Причина в том, что константные и неконстантные перегрузки должны иметь одинаковую семантику и, следовательно, поведение должно быть одинаковым.
Также обратите внимание, что в стандартных контейнерах существует неявное преобразование из iterator
в const iterator
для поддержки использования const_iterator
непосредственно на неконстантных контейнерах.Вы должны сделать то же самое, то есть, если вы предоставляете неявное преобразование из iterator
в const_iterator
, тогда вы можете просто написать:
btree<char>::const_iterator it = myTree.find('M');
... и оно будет работать (не будет проверятьfind
, но позволит вам проверить поведение const_iterator
)