为何调用abs(long long unsigned int)会报歧义错误?修改后为何正常?
为什么直接计算无符号值差值调用abs会报错,存入long long后就正常?
报错的核心原因:C++标准库的
abs函数没有专门处理unsigned long long类型的重载版本。当你直接把两个无符号整数(比如unsigned long long)的计算结果传给abs时,这个结果本身还是unsigned long long类型。编译器需要把这个无符号类型隐式转换成某个有符号整数类型来匹配abs的重载,但它可以转成long long、long、int等多种有符号类型,这些类型都有对应的abs重载,编译器没法确定选哪个,于是抛出“调用重载abs歧义”的错误。修改后编译正常的原因:你把计算结果先存入
long long类型的变量,此时avg1 - avg2的结果是long long(有符号64位整数)。标准库正好提供了abs(long long)的重载,编译器能直接匹配到对应的函数,不会有歧义,自然编译通过。
额外补充:无符号整数的差值如果原本是负数(比如a < b时,a-b在无符号规则下会是一个很大的正数),但存入long long时,只要原无符号值在long long的取值范围内,会被正确转换成有符号的负数,这样调用abs就能得到符合预期的绝对值,逻辑上也更贴合你想要的计算效果。
内容的提问来源于stack exchange,提问作者manofculture
相关产品推荐
相关产品推荐

