比较运算符重载与转换运算符的 C++ 优先级

Rob*_*Hsu 5 c++ operator-overloading operator-precedence

考虑以下程序:

#include <iostream>

using namespace std;

class Foo {
public:
    int k;

    operator int() {
        cout << "convert int" << endl;
        return k;
    }

#if USE_COMPARE
    bool operator < (int rhs) {
        cout << "compare with" << endl;
        return (k < rhs);
    }
#endif
};

int main()
{
    Foo f;
    f.k = 3;
    int m = 5;


    if (f < m) {
        cout << 1 << endl;
        return 1;
    }
    cout << 0 << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

USE_COMPARE被定义的比较if (f<m)将使用比较运算符重载。如果USE_COMPARE未定义,它将f从转换Fooint,然后进行整数比较。在我看来,比较运算符重载的优先级高于转换运算符。任何人都可以从 C++ 标准的角度确认这一点吗?

但是我认为比较运算符应该优先考虑是很自然的。但请从C++标准的角度回答问题。

谢谢。

For*_*veR 5

13.3.3.2/2

比较隐式转换序列的基本形式时(如 13.3.3.1 中所定义)

标准转换序列 (13.3.3.1.1) 是比用户定义的转换序列或省略号转换序列更好的转换序列,并且

用户定义的转换序列 (13.3.3.1.2) 是比省略号转换序列 (13.3.3.1.3) 更好的转换序列。

13.3.3.1/3

格式良好的隐式转换序列是以下形式之一: — 标准转换序列(13.3.3.1.1),

— 用户定义的转换序列(13.3.3.1.2),或

— 省略号转换序列(13.3.3.1.3)。

13.3.3.1/8

如果不需要转换来将参数与参数类型匹配,则隐式转换序列是由标识转换 (13.3.3.1.1) 组成的标准转换序列。

13.3.3.1.2/1

用户定义的转换序列由初始标准转换序列和用户定义的转换 (12.3) 和第二个标准转换序列组成。如果用户定义的转换由转换函数 (12.3.2) 指定,则初始标准转换序列将源类型转换为转换函数的隐式对象参数。

如果定义了比较运算符,则编译器有两种变体:

1) 让

IF = Identity(f)
Run Code Online (Sandbox Code Playgroud)

称呼:

IF.operator <(int)
Run Code Online (Sandbox Code Playgroud)

2) 让:

IF = Identity(f);
converted_int = Identity(IF.operator int());
Run Code Online (Sandbox Code Playgroud)

称呼:

operator < (converted_int, int);
Run Code Online (Sandbox Code Playgroud)

隐式转换序列优于用户转换序列。标准中有两个关于引号重载解析的词,如果您愿意,可以阅读 par 13.3,或仅阅读 13.3.3[over.best.ics]。