Я вижу, что синтаксически правильно следующее:
#include <iostream>
using namespace std;
template<class T> bool operator<= (const T& left, const T& right)
{
cout<<"overloaded"<<endl;
return left<=right;
}
int main()
{
cout<<(10<=5)<<endl;
return 0;
}
Но кажется, что его никогда не вызывают.
Я указал, как звонить оператору
Почему ...
вместо того, что можно скомпилировать и протестировать и продемонстрировать проблему?
Примечание: не делайте этого в рабочем коде (вы также перегружаете операторы для типов встроенных и стандартных библиотек). Это может привести к неожиданным результатам (например, большая часть кода перестанет работать правильно).
Да, я просто хотел бы знать, что здесь происходит
В общем, вы можете перегружать операторы только в том случае, если у вас есть хотя бы один из типов операндов. Следовательно, вы не можете изменить поведение операторов для встроенных типов.
«Да, я просто хотел бы знать, что здесь происходит». Все просто: 10<=5
вызывает встроенный оператор bool по умолчанию, проверяя, меньше ли 10 или равно 5, он не вызывает ваш новый оператор. Как сказал HolyBlackCat, вы не можете изменить поведение операторов для встроенных модулей. В лучшем случае вы можете обернуть их в структуру или класс шаблона и использовать этот новый тип с другим поведением (см. пример Иксисарвинена).
Вы не можете перегружать предопределенные операторы для предопределенных типов.
Примечание: когда эта функция действительно вызывается, return left<=right;
будет вызывать одну и ту же функцию рекурсивно, навсегда (или до тех пор, пока программа не выйдет из строя).
Тот факт, что что-то синтаксически правильно, не означает, что оно делает то, что, по вашему мнению, оно делает (или должно делать).
Для вызова перегруженных операторов хотя бы один операнд должен иметь тип класса или перечисления:
Если ни один операнд оператора в выражении не имеет типа, являющегося классом или перечислением, оператор считается встроенным и интерпретируется в соответствии с [expr.compound].
Ваш operator<=
действителен и будет вызван, если один из операндов был, скажем, классового типа, но в 10<=5
оба операнда имеют int
, т. е. фундаментального типа.
Также обратите внимание, что return left<=right;
приведет к бесконечной рекурсии (почти во всех случаях), поскольку он снова вызовет перегруженный оператор <=
.
Более того, крайне необычно перегружать операторы таким образом, чтобы они вызывались для типов стандартной библиотеки (или пытались сделать это для фундаментальных типов). См. также Можно ли перегружать оператор+ для типов стандартной библиотеки и встроенного типа?. Вам следует придерживаться перегрузки операторов только для ваших собственных типов, например. сделав их скрытыми friend
или функциями-членами или правильно ограничив их.
Следуя комментарию Юксисарвинена под вопросом, это не приведет к бесконечной рекурсии.
@Discipulos, потому что функция Юксисарвинена заканчивается на return false;
. Ваша функция заканчивается на return left<=right;
, что приводит к бесконечной рекурсии: godbolt.org/z/1jGY9h9hE
Здесь оно называется просто отлично: godbolt.org/z/b9r3Phcv7