25

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

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

3 回答 3

21

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

于 2015-04-02T11:41:19.470 回答
11

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

一个有意义的类型的例子,abs但这个实现没有complex<double>

于 2015-04-02T11:20:32.010 回答
1

因为类型 'T' 可以访问任何数据类型,包括 char。那么,如果有人将 char 传递给 abs 函数,您会期待什么。:)

于 2015-04-02T11:14:24.773 回答