C++运算符重载被当作函数调用

6

我正在尝试使用运算符重载,并发现了一些无法解释的问题:

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。
2个回答

10

使用(a,b)会调用奇怪的"逗号"运算符,它首先计算a,然后计算b,最后返回b。

你可以通过拼写operator+(a,b)来调用您的运算符。(在这里,逗号是参数的分隔符,而不是逗号运算符)。


由于一元和二元+运算符都具有更高的优先级,我希望+()首先被评估,因此将逗号解释为分隔符而不是逗号运算符。编译器如何决定+(a,b)是一元+? - Lorenzo Belli
1
@LorenzoBelli 括号改变了计算顺序:+(a,b) 首先计算括号内的内容,然后是一元运算符 +,而 +a,b 则首先计算 +a,然后逗号,最后是 b。 - PaperBirdMaster

1
请查看链接http://en.cppreference.com/w/cpp/language/operator_arithmetic 一元正号,也称为 +a
T::operator+() const;   
T operator+(const T &a);

加法,也称为 a + b

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

使用重载运算符+(a,b)时,您至少应该收到以下警告信息:

警告:逗号运算符的左操作数没有效果[-Wunused-value]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接