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

agu*_*ran 2 c++

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

class Foo {
public:
    operator double() const {
        return 3.14;
    }
};
Run Code Online (Sandbox Code Playgroud)

当我尝试比较实例时:

Foo f1;
Foo f2;

auto res = f1 < f2;
Run Code Online (Sandbox Code Playgroud)

较少的运营商使用现有的

operator double()const

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

Som*_*ken 10

正如评论中所提到的,允许编译器在此处进行1次用户定义的转换.它看到它可以将两个对象转换为double并且double确实具有 operator <,所以它就是这样做的.如果您(程序员)要求它时只想使用转换运算符,您可以添加explicit:

explicit operator double() const {
    return 3.14;
}
Run Code Online (Sandbox Code Playgroud)

现在,编译器只能在您将其显式转换为此类型时调用它:

Foo f1;
double d = (double)f1; // conversion operator
Run Code Online (Sandbox Code Playgroud)


Lig*_*ica 5

您的编译器"希望"使您的<请求正常工作.

没有operator<Foo,但它看到有转换的方式Foodouble.有了这个,通过隐式转换,您的比较将能够成功.

如果操作符被标记explicit(C++ 11或更新),则这种隐式转换将是不可能的,编译器将不得不放弃您的<请求.

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

  • 我认为有关使运算符显式的一个词是有序的.当然,如果OP希望以隐式转换为代价来防止这种情况发生. (2认同)