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从转换Foo为int,然后进行整数比较。在我看来,比较运算符重载的优先级高于转换运算符。任何人都可以从 C++ 标准的角度确认这一点吗?
但是我认为比较运算符应该优先考虑是很自然的。但请从C++标准的角度回答问题。
谢谢。
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]。
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |