我无法理解为什么对于以下虚拟类:
class Foo {
public:
operator double() const {
return 3.14;
}
};
当我尝试比较实例时:
Foo f1;
Foo f2;
auto res = f1 < f2;
less运算符使用现有的
operator double()const
比较值时。我在哪里可以找到这种行为的规则?
答案 0 :(得分:10)
正如评论中所提到的,允许编译器进行1次用户定义的转换,就像它在这里做的那样。它发现它可以将两个对象都转换为double
而double
确实有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或更高版本),则此隐式转换将无法进行,编译器将不得不放弃您的<
请求。
在通话期间选择功能的规则非常复杂,所以如果我是你,我会相信它有效而不是试图解析标准措辞。 :)