Требуется ли конструктор преобразования для этого перегруженного оператора? (C ++) - PullRequest
1 голос
/ 21 марта 2012

Учитывая, что это единственная функция == в классе,

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

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

myClass mc1;
anotherClass ac1;

if ( mc1 == ac1 )

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

Спасибо!

Ответы [ 6 ]

3 голосов
/ 21 марта 2012

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

1 голос
/ 21 марта 2012

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

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

1 голос
/ 21 марта 2012

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

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

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

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

1 голос
/ 21 марта 2012

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

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

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

0 голосов
/ 21 марта 2012

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

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

  2. anotherClass публично получено из myClass.

0 голосов
/ 21 марта 2012

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

...