Джеймс МакНеллис 'ответ действительно охватил все это, но это не повредит (надеюсь) дополнительными объяснениями.
Итак.
Когда вы звоните…
o.operator int()
… тогда выбор перегрузки полностью зависит от константности o
.
Ничего другого.
Чтобы понять почему, рассмотримэтот класс:
struct Bar
{
void f() {}
void f() const {}
};
Технически эти функции-члены не обязательно должны быть функциями-членами.С тем же успехом они могли быть выбраны как независимые функции.Но тогда им нужен аргумент Bar
:
struct Bar
{};
void f( Bar& ) {}
void f( Bar const& ) {}
И, надеюсь, теперь легче понять, что когда вы выполняете
Bar o;
f( o );
, тогда первая функция может бытьвыбран.И так оно и есть.Потому что, если была выбрана вторая функция, вы никогда не сможете получить первую.Потому что, если вы сделаете объект const
, тогда будет нарушено const
правильность выбора первого.Таким образом, когда объект является const
, может быть выбран только второй, следовательно, когда это не const
, выбран первый.
Короче говоря, единственной практической альтернативой этому правилу будет всегдавыберите второй, который сделает первый довольно бесполезным, да?
Cheers & hth.,