gpt4 book ai didi

C++:使用函数重载和 char 到 int 之间的隐式转换,反之亦然

转载 作者:行者123 更新时间:2023-11-30 05:04:49 25 4
gpt4 key购买 nike

在C++中,如果charint是隐式转换,intchar也是隐式转换。通常,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com