C ++ less运算符使用转换运算符

时间:2017-05-03 18:44:40

标签: c++

我无法理解为什么对于以下虚拟类:

class Foo {
public:
    operator double() const {
        return 3.14;
    }
};

当我尝试比较实例时:

Foo f1;
Foo f2;

auto res = f1 < f2;

less运算符使用现有的

  

operator double()const

比较值时。我在哪里可以找到这种行为的规则?

2 个答案:

答案 0 :(得分:10)

正如评论中所提到的,允许编译器进行1次用户定义的转换,就像它在这里做的那样。它发现它可以将两个对象都转换为doubledouble确实有operator <,所以它就是这样做的。如果您(程序员)要求您使用转化运算符,则可以添加explicit

explicit operator double() const {
    return 3.14;
}

现在,编译器只能在您将其明确地转换为这样的类型时调用它:

Foo f1;
double d = (double)f1; // conversion operator

答案 1 :(得分:5)

你的编译器&#34;想要&#34;使<请求有效。

operator<没有Foo,但它看到有办法将Foo转换为double。有了这个,通过隐式转换,您的比较将能够成功。

如果操作符被标记为explicit(C ++ 11或更高版本),则此隐式转换将无法进行,编译器将不得不放弃您的<请求。

在通话期间选择功能的规则非常复杂,所以如果我是你,我会相信它有效而不是试图解析标准措辞。 :)