我遇到了一些std::abs
可能产生意外结果的方式的不同示例:
<cstdlib>
为整数类型提供重载,而<cmath>
为浮点类型提供重载。未能包含正确的标头会给出未定义的行为,允许编译器静默接受std::abs(short)
返回double
,尽管大多数编译器会忽略相关的措辞并返回{ {1}}。此问题的解决方案表明在C ++ 17中更改了措辞,以便int
返回std::abs(short)
int
会导致难以发现的错误,因为(在现代C ++中)引入std::abs
的标题允许引入全局std::abs
函数(可能有也可能没有相同的重载),并且很容易意外使用abs
而不是abs
我所知道的修复是:
std::abs
则包括<cstdlib>
,评估std::abs([integral type])
<cmath>
std::abs([floating point type])
可能返回std::abs(short)
或int
这一事实,具体取决于编译器对C ++ 11 / C ++ 14标准的符合性double
,以便–Wconversion
之类的调用在编译时触发警告abs(2.0)
不明确的诀窍:
abs
问题:是否有理由更喜欢其中一种解决方案发布3?这些修复中的任何一个都会引入我需要注意的其他潜在问题吗?
答案 0 :(得分:5)
创建自己的头文件,定义inline
函数absolute
,后者又包含所有正确的标头并修复返回类型的错误,并调用std::abs
。
然后,请勿使用abs
或std::abs
(或任何名为abs
的令牌)。在git commit(或您使用的任何版本管理系统)中执行此操作,而不是在该文件中。