Abs和使用命名空间std

Mav*_*nav 0 c++ namespaces std absolute-value

假设我正在使用using namespace std(不可否认的不良做法)并且我abs在我的代码中使用该函数(以获得重载的绝对函数).具体来说,我的MWE是:

#include <cmath>
#include <iostream>
#include <stdlib.h>

using namespace std; 

int main(int argc, char* argv[]) {

 double f(-0.4);
 std::cout<<"abs(f) = "<<abs(f)<<std::endl;

}
Run Code Online (Sandbox Code Playgroud)

如果我注释掉该using namespace std;行,则输出为

abs(f) = 0
Run Code Online (Sandbox Code Playgroud)

否则输出是

abs(f) = 0.4
Run Code Online (Sandbox Code Playgroud)

我不明白的是,在后一种情况下如何调用"正确的"abs函数,因为即使stdlib.h有一个abs只返回int's'的函数.

事实上,这个问题的第二个答案是使用using namespace std;可能还不够.这是真的?我的MWE似乎与此相矛盾.

我在Linux上使用gcc-4.8,这可能是解决依赖关系最有问题的组合.

R S*_*ahu 5

当你使用

using namespace std;
Run Code Online (Sandbox Code Playgroud)

您将以下重载abs带入范围:

std::abs(int)
std::abs(float)
std::abs(std::complex)
Run Code Online (Sandbox Code Playgroud)

电话会abs(f)解决std::abs(float).

如果你不使用

using namespace std;
Run Code Online (Sandbox Code Playgroud)

只有一个abs功能可以使用.

abs(int)
Run Code Online (Sandbox Code Playgroud)

因此,呼叫abs(f)解决了abs(int).

您仍然可以删除该using namespace std;行并使用std::abs(f)而不是仅使用abs(f).