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