Синтаксис вызова оператора в переполнении стека

Может ли быть ситуация, когда синтаксис

if (first == second) // ...

отличается от этого?

if (first.operator==(second)) // ...

Я так не думаю, но просто хочу это знать.

8

Решение

a == b

иногда эквивалентно

a.operator==(b)

а иногда эквивалентно

operator==(a,b)

и иногда эквивалентно ни одному, если значение в конечном итоге является «встроенным» значением == для неклассных типов.

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

9

Другие решения

Если вы имеете в виду «когда два синтаксиса не эквивалентны», то ответ будет, когда оператор равенства не является членом какого-либо типа first является. Очевидно, что второй вариант не будет работать для типов без члена operator==, Это включает в себя встроенные типы.

Когда оператор-член существует для типа first, тогда они различаются, потому что оператор, не являющийся членом, может разрешать преобразования типов для обоих first а также secondв то время как пример с оператором-членом может разрешить преобразование только для second,

3

Одним из примеров ситуации, в которой два оператора имеют разные эффекты, является то, что вы имеете неявные преобразования first, Например:

struct my_int
{
int num;

my_int(int num) : num(num) {}
};

bool operator==(const my_int& a, const my_int& b)
{
return a.num == b.num;
}

В этом случае следующий допустимый код C ++:

my_int a(1);
int x = 1;

if (x == a) {
std::cout << "Equal\n";
}

Где компилировать этот код:

my_int a(1);
int x = 1;

if (x.operator==(a)) {
std::cout << "Equal\n";
}

Выдает ошибку компиляции, как показано ниже:

translation.cpp: в функции int main (): translation.cpp: 21: 16: ошибка:
запрос на член ‘operator ==’ в ‘x’, который не относится к классу
«INT»

1

Второй не будет работать с примитивами. Однако обе формы будут работать с пользовательскими типами, у которых этот оператор публично перегружен.

0

Если ваш вопрос основан только на синтаксисе, то это зависит от типа параметров. Рассмотрим следующий код:

#include <iostream>

using namespace std;

class a {public:

a(){
}

int operator ==(const a& v){
cout << "member operator" << endl;
return false;
}

};

int operator ==(a &v1, a &v2){
cout << "external operator" << endl;
return true;
}int main(){

a a1, a2;

if (a1 == a2 && a1.operator==((const a&)a2)) {
cout << "done" << endl;
}

}

В этой настройке вызываются оба оператора.
Если параметры типа функции совпадают, кажется, что метод будет предпочтительным.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector