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

时间:2015-02-05 07:51:14

标签: 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;
}

定义USE_COMPARE时,if (f<m)的比较将使用比较运算符重载。如果未定义USE_COMPARE,则会将fFoo转换为int,然后执行整数比较。在我看来,比较运算符重载的优先级高于转换运算符。任何人都可以用C ++标准来证实这一点吗?

但我认为比较运营商应该优先考虑其性质。但请从C ++标准的角度回答这个问题。

感谢。

1 个答案:

答案 0 :(得分:3)

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)指定,即初始值   标准转换序列将源类型转换为隐式   转换函数的对象参数。

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

1)让

IF = Identity(f)

呼叫:

IF.operator <(int)

2)让:

IF = Identity(f);
converted_int = Identity(IF.operator int());

呼叫:

operator < (converted_int, int);

隐式转换序列优于用户转换序列。 标准中有两个关于引号的重载分辨率的单词,如果你想要你可以读取参数13.3,或者只是13.3.3 [over.best.ics]。