我检查了python hereabsfabs之间的区别

据我了解,关于速度和传递的类型有一些区别,但是我的问题与V.S上的 native c++有关。

关于V.S.
我在Visual Studio 2013 (v120)上尝试了以下内容:

float f1= abs(-9.2); // f = 9.2
float f2= fabs(-9); // Compile error [*]

所以fabs(-9)会给我一个编译器错误,但是当我尝试执行以下操作时:
double i = -9;
float f2= fabs(i); // This will work fine

我从第一个代码中了解到,由于fabs(-9)需要加倍,因此它无法编译,并且编译器无法将-9转换为-9.0,但是在第二个代码中,编译器将在编译时将i=-9转换为i=-9.0,因此fabs(i)可以正常工作。

有更好的解释吗?

另一件事,为什么编译器不能接受fabs(-9)并将int值自动转换为类似于C#中的double值?
[*]:

Error: more than one instance of overloaded function "fabs" matches the argument list:
        function "fabs(double _X)"
        function "fabs(float _X)"
        function "fabs(long double _X)"
        argument types are: (int)

最佳答案

在C++中,对于有符号整数和浮点类型,std::abs重载。 std::fabs仅处理浮点类型(C++ 11之前的版本)。请注意,std::很重要,出于遗留原因通常可用的C函数::abs将仅处理int!

问题所在

float f2= fabs(-9);

不是说没有从int(-9的类型)到double的转换,而是编译器不知道要选择哪种转换(int-> floatdoublelong double),因为这三个都存在std::fabs。解决方法明确地告诉编译器使用int-> double转换,因此消除了歧义。

C++ 11通过添加double fabs( Integral arg );来解决此问题,该函数将返回转换为abs的任何整数类型的double。显然,这种过载在libstdc++和libc++的C++ 98模式下也可用。

通常,只需使用std::abs,它将做正确的事情。 (Interesting pitfall指出了@Shafik Yaghmour。无符号整数类型在C++中很有趣。)

10-02 05:36