Перегрузка оператора C ++ называется функцией

Я экспериментирую с перегрузкой операторов и нашел то, что не могу объяснить:

WeekDays.h

using namespace std;
enum DAYS
{
MON,
TUE,
WED,
THU,
FRY,
SAT,
SUN
};

DAYS operator+(DAYS&a,DAYS &b)
{
printf("Binary+ called\n");
return (DAYS)(((unsigned int)a+(unsigned int)b)%7);
}

//Increment 3
DAYS operator+(DAYS&a)
{
printf("Unary+ called\n");
return (DAYS)(((unsigned int)a+3)%7);
}

ostream& operator<<(ostream&o, DAYS &a)
{
switch(a){
case MON: o<<"MON"; break;
case TUE: o<<"TUE"; break;
case WED: o<<"WED"; break;
case THU: o<<"THU"; break;
case FRY: o<<"FRY"; break;
case SAT: o<<"SAT"; break;
case SUN: o<<"SUN"; break;
}
return o;
};

main.cpp

#include <iostream>
#include "WeekDays.h"using namespace std;

void main()
{
DAYS a=MON; //=0
DAYS b=TUE; //=1
cout<< +a       <<endl;
cout<< +b       <<endl;
cout<< +(a,b)   <<endl;
cout<< (a+b)    <<endl;
cin.get();
}

Выход

Unary+ called
3
Unary+ called
4
Unary+ called
4
Binary+ called
1

Почему + (a, b) оценивается как унарный оператор + b? Я не смог объяснить это.

Ссылка на соответствующую тему Перегрузка оператора .
Я использую VisualStudio 2012.

6

Решение

С (a,b) вам случается вызвать странное оператор «запятая», который оценивает сначала a, затем b и, наконец, возвращает b.

Вы можете позвонить своему оператору, объяснив это как operator+(a,b), (Здесь запятая является разделителем для параметров, и не оператор запятой).

10

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

Пожалуйста, посмотрите на ссылку http://en.cppreference.com/w/cpp/language/operator_arithmetic

унарный плюс, ака + а

T::operator+() const;
T operator+(const T &a);

кроме того, ака а + б

T::operator+(const T2 &b) const;
T T operator+(const T &a, const T2 &b);

С вашим перегруженным оператором + (a, b) вы должны получить по крайней мере это предупреждение:
предупреждение: левый операнд оператора запятой не действует [-Wunused-value]

1

По вопросам рекламы [email protected]