阅读很长的功能非常有趣!
int crazylongfun()
{
int x = -1;
foo b = -42;
//... 1000 lines below
if( b<-x)
{
std::printf("How did I get here there is no left arrow operator?\n");
}
return 0;
}
看foo定义
struct foo
{
int x;
foo(int a) : x(a) {}
operator int() const
{
return x;
}
};
这可以很好地编译并产生所需的输出。允许这种情况的机制是什么?
答案 0 :(得分:5)
简单地说,&#34;小于负X&#34;。
if (b < -x)
在1000行之后,我也会有点眼睛!
答案 1 :(得分:3)
可以说c ++中的隐式转换运算符是有争议的,例如Are implicit conversions good or bad in modern C++?。当它们被定义时,对于不知道的程序员来说,可能会有非常有趣的语法情境。以上只是一个例子。
这是如何工作的:
Struct foo定义了转换运算符,因此它可以转换为int,这会导致它被隐式转换并与局部变量x进行比较,小于负x。
代码实际上是:
if(int(b)<(-x))
即。在c ++中没有左箭头操作符&lt; -
答案 2 :(得分:3)
运算符
<-
在c ++中做了什么?
它实际上不是一个运算符(与->
相比,它是一个)。
正如其他答案中所提到的,实际上已经应用了两个运算符函数:
operator-()
对值operator<()