2012-03-20 3 views
1

Учитывая, что это единственная функция == в классе,Является ли конструктором преобразования для этого перегруженного оператора? (C++)

bool myClass::operator == (const myClass & rhs) 
{ 
    if (var1 == rhs.var1) 
     return true; 
    else 
     return false; 
} 

Что предположить следующее сравнение?

myClass mc1; 
anotherClass ac1; 

if (mc1 == ac1) 

Мой инстинкт должен был сказать, что он предполагает, что ac1 будут преобразованы к типу MyClass, но как это может произойти? operator == имеет параметр типа myClass & rhs, так как можно вызвать конструктор преобразования myClass, когда ac1 передается функции?

Спасибо!

+2

Conversion создает временный объект. Ссылки 'const' могут связываться с временными. Если бы оператор был 'bool myClass :: operator == (myClass & rhs)', то преобразование было бы невозможным. –

+0

Спасибо за ответ, но почему это? – JamesGold

+0

. Стандарт C++ запрещает привязывать ссылку, отличную от 'const', к временной переменной (хотя, по крайней мере, один главный компилятор игнорирует это правило). Выводы довольно просты: если функция записывает свои результаты с помощью контрольного параметра, не связанного с 'const', и эта ссылка привязана к временному, они будут потеряны. –

ответ

1

Поскольку нет идеальной перегрузки для этого оператора, вызывающий конструктор преобразования (он считается неявным преобразованием), а созданный таким образом временный код передается на ваш operator==. После вызова временное уничтожение.

Обратите внимание, что это не произойдет, если operator== принял ссылку const, поскольку временные данные могут быть привязаны только к const ссылкам.

+0

Спасибо за ответ, но почему это? (что временные данные могут быть найдены только для ссылок на константу) – JamesGold

+1

@JamesGold: это не проблема, а скорее «защитная сетка»; см. [этот вопрос] (http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to-a-temporary-object). –

1

Компилятор берет левую сторону и пытается найти для него правильный оператор.

Таким образом, он примет оператор == и попытается установить правую сторону на myClass путем кастинга.

Если он не может найти неявный литье в myClass, оно вернет ошибку компиляции.

0

Ваше предположение верно. Компилятор сначала поместит его в вызов конструктора преобразования, затем вызовет ваш метод == с преобразованным объектом в качестве аргумента rhs.

1

Компилятор, заданный mc1 == ac1, будет искать наилучшее совпадение для оператора == (A, B), используя правила нормального разрешения перегрузки для любой функции.

Предполагая, что он находит ваш bool myClass::operator==(const myClass&) функции на однозначно лучший матч (это может быть не так. Например, он может найти оператор объявил bool operator==(const myClass&, const anotherClass&), который превосходит вместо этого), он будет связывать и сделать необходимые преобразования параметров, как это было бы для любого вызова функции.

Чтобы сделать преобразование из lvale типа anotherClass к const myClass& (при условии, anotherClass не наследует от MyClass, в этом случае преобразования не будет необходимости) он будет искать один (однозначно лучше) преобразующий конструктор или оператор преобразования, чтобы включить параметр в myClass, а затем выполнить вызов operator == с этим.

Это параметр функции - это неконстантная ссылка, которая не будет рассматривать возможность такого временного преобразования. Причина заключается в том, что ссылка не const const обычно указывает на то, что функция будет выполнять какое-то побочное воздействие на этот параметр, который будет отбрасываться при временном уничтожении, если исходный объект не будет удален - поэтому скорее всего это будет логическая ошибка, случайно отменившая это побочное действие чем преднамеренно, так что разработчики языка отказались от этого.

3

Параметр имеет тип const myClass &, поэтому вызывается вызов преобразования, создается временная структура и передается функция const-ссылки на такое временное. По возвращении временное уничтожается.

0

Есть еще два возможных ответа на вашу загадку, не связанные с конструкторами беседы.

  1. Там существует свободная функция, bool operator==(const myClass&, const &anotherClass); или

  2. anotherClass публично производные от myClass.

Смежные вопросы