Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:使用函数重载并在char和int之间进行隐式转换,反之亦然 > C++中,如果 char >代码> int >代码>是隐式转换,代码> int > char 也是隐式转换。通常,char是单字节或双字节。在32位机器上,int通常是4字节。因此,int-to-char转换可能会丢失数据(从较大的存储区域移动到较小的存储区域),其中aschar-to-int是更符合逻辑的隐式转换候选者。 那么,这个呢? 比如说,我们试图用参数来重载函数,参数是(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; } void f(字符a,int b) { cout_C++_Char_Int_Implicit Conversion_Overloading - Fatal编程技术网

C++;:使用函数重载并在char和int之间进行隐式转换,反之亦然 > C++中,如果 char >代码> int >代码>是隐式转换,代码> int > char 也是隐式转换。通常,char是单字节或双字节。在32位机器上,int通常是4字节。因此,int-to-char转换可能会丢失数据(从较大的存储区域移动到较小的存储区域),其中aschar-to-int是更符合逻辑的隐式转换候选者。 那么,这个呢? 比如说,我们试图用参数来重载函数,参数是(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; } void f(字符a,int b) { cout

C++;:使用函数重载并在char和int之间进行隐式转换,反之亦然 > C++中,如果 char >代码> int >代码>是隐式转换,代码> int > char 也是隐式转换。通常,char是单字节或双字节。在32位机器上,int通常是4字节。因此,int-to-char转换可能会丢失数据(从较大的存储区域移动到较小的存储区域),其中aschar-to-int是更符合逻辑的隐式转换候选者。 那么,这个呢? 比如说,我们试图用参数来重载函数,参数是(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; } void f(字符a,int b) { cout,c++,char,int,implicit-conversion,overloading,C++,Char,Int,Implicit Conversion,Overloading,如果有两个重载,如: auto foo(int, char) { std::cout << __PRETTY_FUNCTION__ << std::endl; } auto foo(char, int) { std::cout << __PRETTY_FUNCTION__ << std::endl; } 那么这个电话是不明确的 例如,gcc认为: 这是一个很好的解释:编译器可能会将第一个char参数升级为int,并调用第一个重载

如果有两个重载,如:

auto foo(int, char) {
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

auto foo(char, int) {
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}
那么这个电话是不明确的

例如,gcc认为:

这是一个很好的解释:编译器可能会将第一个
char
参数升级为
int
,并调用第一个重载。也可能会对第二个参数执行相同的操作。这两种方法都同样有效。因此编译器会抱怨

如果要调用具体的版本,可以使用
static\u cast

static_cast<void(*)(int, char)>(foo)('a', 'a');
static_cast(foo)('a','a');
那么,这个呢?比如说,我们试图用参数(int,char)和另一个参数(char,int)重载函数,如果我用(char,char)调用函数,这会是不明确的吗


是的,这是不明确的。两个候选转换序列包含相同数量的相同首选转换步骤。

请张贴一条说明您的问题;您可能还会发现这将回答您的问题。“通常,字符是单字节或双字节”.No.
char
从来不是两个字节。它总是正好是一个字节。@user207933一个字符是一个字符-一个字节是另一个字符。两者都不是:
错误:调用重载的“f”(char&,char&)“是含糊的< /代码> @李察-不幸的是,C++标准对术语字节有自己的定义,使它与<代码> char < /代码>的大小相同,至少8位,而不是更常见的8位,而代码< > siZeof(char)=1 < /代码>。
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) {
      ^~~
static_cast<void(*)(int, char)>(foo)('a', 'a');