use*_*176 11 c++ language-lawyer
我遇到了一些不同的例子,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{
int abs(int);
}
using namespace neveruse;
Run Code Online (Sandbox Code Playgroud)
问题:是否有理由更喜欢其中一种解决方案发布3?这些修复中的任何一个都会引入我需要注意的其他潜在问题吗?
创建自己的头文件,定义一个inline函数absolute,该函数又包含所有正确的头文件,并修复返回类型和调用的错误std::abs.
然后,不要使用abs或std::abs(或任何令牌abs).在git commit(或您正在使用的任何版本管理系统)中执行此操作,而不是在该文件中.