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

标签 c++ char int implicit-conversion overloading

在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/

相关文章:

c++ - 当父类(super class)持有指向 X 的指针,子类持有 Y : X

C++ 静态类成员和非默认构造函数

java - 可以将整数值分配给 char 但不能将整数变量分配给 char

C 中的字符数组

php - 如何在 PHP 中将 11、22、33 转换为 10、20 和 30?

c++ - 处理打开方式的事件 (WinApi)

类的 C++ 动态内存分配

C函数删除字符串

C语言计数器

python - 字符串索引超出 Python 范围