c++;没有自动类型转换的函数重载不明确 我的问题是为什么在C++中调用重载函数时,自动类型转换不起作用。示例代码如下: void test(char t); void test(short t); void test(long long t); void main(){ int a=8; test(a); }

c++;没有自动类型转换的函数重载不明确 我的问题是为什么在C++中调用重载函数时,自动类型转换不起作用。示例代码如下: void test(char t); void test(short t); void test(long long t); void main(){ int a=8; test(a); },c++,C++,如果我用g++/clang++编译上面的代码,那么在 测试(a) 为什么编译器不在这里应用自动类型转换规则?函数main()中的变量a是int类型,应将其转换为long-long类型,以避免精度损失。 我不想为int或long类型编写重复的函数。当然,我可以通过下面的显式强制转换来避免错误: 测试((长)a) 但是,每次需要为int或long类型的参数调用test(long-long)时,是否必须使用显式强制转换?有没有办法使编译器更智能 谢谢你的回答。简言之,是的,你每次都必须明确地施法 在您

如果我用g++/clang++编译上面的代码,那么在

测试(a)

为什么编译器不在这里应用自动类型转换规则?函数main()中的变量aint类型,应将其转换为long-long类型,以避免精度损失。 我不想为int或long类型编写重复的函数。当然,我可以通过下面的显式强制转换来避免错误:

测试((长)a)

但是,每次需要为int或long类型的参数调用test(long-long)时,是否必须使用显式强制转换?有没有办法使编译器更智能


谢谢你的回答。

简言之,是的,你每次都必须明确地施法

在您的情况下,问题是您有多个可能的类型转换。
int
可以隐式转换为所有三种类型(
char
short
long
)。 所以编译器无法确定在这种情况下使用什么类型转换

您可以在这里阅读有关隐式类型转换的更多信息

您可以通过模板实现您的目标:

// any type that hasn't explicit definition
template <typename T = long long>
void test(T t);

// process char differently
void test(char c);

// process short differently
void test(short c);
//没有显式定义的任何类型
模板
孔隙试验(T);
//以不同的方式处理字符
孔隙试验(c);
//以不同的方式处理短消息
孔隙试验(简称c);

这肯定是不安全的,但也有可能。我建议您在模板函数中添加static assert。

如果在源代码中没有显式地进行任何自动类型转换,则该转换都是隐式转换 小于int(
char
signed char
、unsigned char、
short int
unsigned short
)的整数类型的值提升为
int

因此,当您这样做时,会混淆调用哪一个(因为两者都隐式成为void test
(int t)

但当您发送准确的数据类型信息时,不会产生混淆

#include<iostream>


void test(int  t);
void test(short t);
void test(long long t);

int main(){
    int a=8;
    test(a);
}
#包括
孔隙试验(int t);
孔隙试验(短t);
孔隙试验(长t);
int main(){
INTA=8;
测试(a);
}
如果你决定离开编译器,你肯定会遇到麻烦

按照链接停止隐式转换


我知道自动类型转换是一种隐式转换,但为什么编译器会混淆?char和short比int窄,int比long-long窄,所以如果test(a)调用test(char)或test(short),a在调用test(long-long)时会失去一些精度是完美的。数字转换的自动类型转换规则之一是避免精度损失,对吗?我的老师曾经讲过一个故事:)这就像当你想把一封信交给儿子时,如果儿子不在,父亲可以拿走这封信;测试(a);没有一个接受者可用,所以尝试让多人表现得像父亲一样..尝试一些无效测试(int t);孔隙试验(短t);int main(){int a=8;test(a);}当你混淆编译器时,你不会看到类似的问题。编译器会混淆你。如果有函数接受int,然后发送int。不要让编译器假设,我认为这是因为编译器不够聪明。我只是不想编写重复的函数,比如test(int)或test(long),因为它们的行为与test(long-long)相同,而test(char)和test(short)的行为不同。我以为编译器可以自动决定使用哪个重载函数,但似乎我错了。谢谢你的回答。我希望编译器在这种情况下会更智能,因为它的实现并不复杂,对吧?谢谢你的回答。我读了链接,上面说数字转换的自动类型转换是从较窄的转换到较宽的转换,以避免精度损失,对吗?在我的例子中,char和short比int窄,因此int不应该在其中隐式转换,但是int可以在long-long中隐式转换,因为long-long比int宽。隐式转换int为char或short时会导致精度损失。编译器是否认为int可以在我拥有的所有三种类型(char、short、long-long)中进行隐式转换?不确定,但据我所知,所有编译器的行为都是这样的。在我看来,显式比隐式好。如果你真的需要实现你的目标,请查看我编辑的答案。谢谢你的回答。使用模板解决了我的问题。我仍然希望编译器或C++标准能够更聪明:
#include<iostream>


void test(int  t);
void test(short t);
void test(long long t);

int main(){
    int a=8;
    test(a);
}