考虑这个程序:
#include <iostream>
using namespace std;
void f(unsigned char c) {
cout << c << endl;
}
void f(int c) {
cout << c << endl;
}
int main() {
f('a');
}
Run Code Online (Sandbox Code Playgroud)
这打印出来97,表明f()所选择的重载是一个人int.我发现这很奇怪; 是不是直觉上unsigned char是一个更好的匹配char?
是不是直觉上
unsigned char是一个更好的匹配char?
嗯,我想,但不是根据标准.根据[conv.prom]p1:
以外的整数类型的prvalue
bool,char16_t,char32_t,或wchar_t,其整数转换秩小于INT的秩可以被转换成类型的prvalueint如果int可以表示源类型的所有值; [...]
现在,三种字符类型具有相同的排名,而签名类型的排名始终小于int.这是组合[conv.rank]p1.6和[conv.rank]p1.2:
有符号整数类型的等级应大于具有较小大小的任何有符号整数类型的等级.
[...]
军衔
char应等于的秩signed char和unsigned char.
基本上,每个角色的等级总是小于,int并且它们都可以用a表示int,因此重载unsigned char不是更好的匹配,因为它将涉及转换char为unsigned char,而不是促销.
如果你改变你的超载来取一个char,那么就会有一个完全匹配,所以很自然地会选择"正确的"超载(在你眼中).
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |