让我们看一些代码示例:
! 4 > 0;
根据 C++ 标准,我们知道,首先进行否定,而不是比较。但是如果我们稍微扩展一下这个例子:
#include <iostream>
class Test
{
public:
bool operator!() const
{
std::cout << "operator!" << std::endl;
return false;
}
bool operator>(const int &) const
{
std::cout << "operator>" << std::endl;
return false;
}
};
int main(int argc, char * argv[])
{
Test t;
std::cout << "t > 0;" << std::endl;
t > 0;
std::cout << "! t > 0;" << std::endl;
! t > 0;
std::cout << "!t.operator>(0)" << std::endl;
! t.operator>(0);
return 0;
}
该程序的输出将是:
t > 0;
operator>
! t > 0;
operator!
!t.operator>(0)
operator>
- 第一次调用(控制调用)很清楚。我们检查是否调用了我们想要的运算符。
- 第二个电话是我首先陈述的证明。首先调用否定运算符,然后调用结果(布尔)运算符>。
- 第三个电话是困扰我的。
这里提出了我的问题。为什么SomeObjInstance > 0
call 不同于SomeObjInstance.operator>(0)
. 我知道以第二种方式(作为成员)调用操作员并不常见,但为什么这种调用不同?如果成员操作员不存在,我总是坚持将SomeObjInstance > 0
其转换为成员调用SomeObjInstance.operator>(0)
或函数调用。bool operator>(const Test &, int)
在 C++ 标准中描述了这种行为,或者这可能是某种未定义的行为?