鉴于以下计划:
#include <cmath>
int main()
{
std::abs(0u) ;
}
Run Code Online (Sandbox Code Playgroud)
gcc并且clang不同意这是否是不正确的.使用gcc与libstdc++代码建立无错误或警告(见直播),同时采用clang与libc++它生成以下错误(见直播):
error: call to 'abs' is ambiguous
std::abs(0u) ;
^~~~~~~~
Run Code Online (Sandbox Code Playgroud)
哪个结果是正确的?应该abs(0u)是暧昧与否?
MSalters指出了一个有趣的相关问题:std :: abs的模板版本.
我遇到了一些不同的例子,std::abs可以给出意想不到的结果:
<cstdlib>为整数类型<cmath>提供重载,同时为浮点类型提供重载.未能包含正确的标头会给出未定义的行为,允许编译器静默接受std::abs(short)返回a double,尽管大多数编译器忽略相关的措辞并返回int.这个问题的解决方案表明在C++ 17中改变了措辞,因此std::abs(short)返回一个intstd::abs可能会导致难以发现的错误,因为(在现代C++中)引入的头文件std::abs是允许引入一个全局abs函数(可能有也可能没有相同的重载),并且很容易意外使用abs而不是std::abs我所知道的修复是:
<cstdlib>评估std::abs([integral type])和<cmath>评估时std::abs([floating point type])std::abs(short)可能返回int或double依赖于编译器符合C++ 11/C++ 14标准的事实–Wconversion以便调用abs(2.0)在编译时触发警告abs模棱两可特技:
namespace neveruse{ …Run Code Online (Sandbox Code Playgroud)