考虑以下计划:
#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
,则会将f
从Foo
转换为int
,然后执行整数比较。在我看来,比较运算符重载的优先级高于转换运算符。任何人都可以用C ++标准来证实这一点吗?
但我认为比较运营商应该优先考虑其性质。但请从C ++标准的角度回答这个问题。
感谢。
答案 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]。