作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在C++中,如果char
到int
是隐式转换,int
到char
也是隐式转换。通常,char
是单字节或双字节。在 32 位机器上,int
通常是 4 字节。因此,int 到 char
转换有数据丢失的可能性(从较大的区域移动到较小的存储区域),而 char 到 int
是隐式转换的更合乎逻辑的候选者.现在,这个怎么样?比如说,如果我用 (char, char)
,这是模棱两可的还是调用 (char, int)
更符合逻辑?例如,
void f(char a, int b)
{
cout << "f(char, int) called" << endl;
}
void f(int a, char b)
{
cout << "f(int, char) called " << endl;
}
int main()
{
char a = 'a', b = 'b';
f(a, b); // which overloaded function should be called?
return 0;
}
最佳答案
如果您有两个重载,例如:
auto foo(int, char) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
auto foo(char, int) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
然后尝试调用:
foo('a', 'a');
那么调用是不明确的。
例如,gcc reports那:
error: call of overloaded 'foo(char, char)' is ambiguous
foo('a', 'a');
^
note: candidate: 'auto foo(int, char)'
auto foo(int, char) {
^~~
note: candidate: 'auto foo(char, int)'
auto foo(char, int) {
^~~
这很有意义:编译器可能会将第一个 char
参数提升为 int
并调用第一个重载。或者它可能对第二个参数做同样的事情。两种方式都同样有效。所以编译器会报错。
如果你想调用一个具体的版本,你可以使用static_cast
:
static_cast<void(*)(int, char)>(foo)('a', 'a');
关于C++:使用函数重载和 char 到 int 之间的隐式转换,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48663984/
我是一名优秀的程序员,十分优秀!