std :: abs的模板版本

时间:2015-04-02 11:10:55

标签: c++ templates cmath

Here列出了C ++中std::abs的当前重载。我想知道为什么不定义以下模板并放弃所有丑陋的C风格重载?

template <typename T> inline
T abs(const T& v) { return v < 0 ? -v : v; }

3 个答案:

答案 0 :(得分:21)

LWG issue 2192。目前,如果std::abs(x-y) < 2x未签名,y将失败。这会捕获一个微妙的编程错误。通过提议的更改,它可以编译但完全错误。 abs(3u-4u)会比2大得多,实际上它是UINT_MAX

答案 1 :(得分:10)

这会遇到匹配所有内容的常见问题。

abs有意义的类型示例,但此实现不是complex<double>

答案 2 :(得分:1)

因为类型'T'可以访问包括char在内的任何数据类型。那么如果有人将char传递给abs函数,你有什么期望? :)