Abs 和使用命名空间标准

Abs and using namespace std

假设我正在使用 using namespace std(不可否认 bad practice) and that I use the abs function in my code (to get the overloaded absolute function)。具体来说,我的 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;

}

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

abs(f) = 0

否则输出为

abs(f) = 0.4

我不明白的是 "correct" abs 函数是如何在后一种情况下调用的,因为即使 stdlib.h 也有一个 abs 函数,而 returns int 的。

事实上 this question 的第二个答案说使用 using namespace std; 可能 不够 。这是真的?我的 MWE 似乎与此相矛盾。

我正在 Linux 并使用 gcc-4.8,这可以说是解决依赖关系问题最严重的组合。

当您使用

using namespace std;

您将 abs 的以下重载带入作用域:

std::abs(int)
std::abs(float)
std::abs(std::complex)

调用 abs(f) 解析为 std::abs(float)

如果你不使用

using namespace std;

您只能使用一个 abs 功能。

abs(int)

因此,调用 abs(f) 解析为 abs(int)

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