C++中的"using namespace::std"是什么

What is "using namespace::std" in C++

我正在阅读其他人的一些代码片段并找到一行:

using namespace::std;

我怀疑它的目的是 using namespace std;,有一些错别字。但令我惊讶的是,编译器毫无怨言地接受了这段代码。我构建:

$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0

$ /usr/bin/g++ ${SRC} -std=c++11 -pthread -Wall -Wno-deprecated -o ${OUT}

请问这段代码为什么有效,会产生什么影响?我怀疑这是一种不好的做法。

相当于using namespace ::std;,也相当于using namespace std;::指的是全局命名空间,std确实放在全局命名空间中。

作为using-directives的语法:

(强调我的)

attr(optional) using namespace nested-name-specifier(optional) namespace-name ;   

... ...
nested-name-specifier - a sequence of names and scope resolution operators ::, ending with a scope resolution operator. A single :: refers to the global namespace.
... ...

using namespace::std 等同于 using namespace std;

::符号是作用域解析运算符。当在其前面没有范围名称的情况下使用时,它指的是全局名称空间。这意味着 std 是顶级命名空间,不包含在另一个命名空间中。

在这种情况下,:: 前后的空格是可选的,因为词法分析器可以从上下文中推断出标记。

例如,以下所有都有效:

namespace A { namespace notstd{} } // define my own namespaces A and A::notstd
using namespace::std; // the standard library std
using namespace A;
using namespace ::A;
using namespace::A;
using namespace A::notstd;

更新:

如其中一条评论所述,如果语句位于另一个包含其自己的嵌套命名空间 std 的命名空间中,using namespace ::std;using namespace std; 实际上可能会导致不同的结果。请参阅以下(极不可能)示例:

#include <stdio.h>

namespace A {
    namespace std {
        int cout = 5;
    }
    using namespace std; 
    void f1() {
        cout++;
    }
}

int main()
{
    A::f1();
    printf("%d\n",A::std::cout); // prints 6

    return 0;
}