“using namespace std;”在“#include <foo>”之前</foo>

时间:2012-03-31 02:39:01

标签: c++ c++11

以下两个源文件之间的可编译性或生成代码(如果有)有何不同之处:

附件A

namespace std {};
using namespace std;
#include <vector>
#include <string>

<any code here>

图表B

#include <vector>
#include <string>
using namespace std;

<any code here>

假设两个<any code here>占位符替换为任何相同的用户代码。

换句话说:如果“using namespace std;”有任何用户可见的区别吗?放在标准#includes之前(假设如上所述引入名称空间std)?

2 个答案:

答案 0 :(得分:5)

尽管可能不太可能,但以下代码可能在您的实现的向量标题中:

namespace __AA
{
    class vector {};
}

namespace std
{
    // actual std::vector implementation here
}

namespace __BB
{
    using namespace __AA;
    vector x;
}

现在有了图表A ,你就会产生歧义。

答案 1 :(得分:1)

在任何实际的标准库实现中都没有任何区别,因为using指令对命名空间std内的定义没有影响(因为std已经是当前范围)。

如果任何标准库实现产生负面影响,我会认为这是严重的实施质量缺陷。