什么是 C++ 中的“使用命名空间::std”

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

提问人:rustyhu 提问时间:12/16/2021 最后编辑:songyuanyaorustyhu 更新时间:12/17/2021 访问量:1055

问:

我正在阅读其他人的一些代码片段,我发现一行:

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}

我想知道为什么这个代码是有效的,它会产生什么影响?我怀疑这是一种不好的做法。

C++ 命名空间 using 指令

评论

1赞 Remy Lebeau 12/16/2021
你能在一些实际编译的代码的上下文中展示这一点吗?
1赞 Ulrich Eckhardt 12/16/2021
您可以使用它来指示某些内容来自全局命名空间。 表示嵌套在全局命名空间中,就这么简单。::::stdstd
2赞 Raildex 12/16/2021
@UlrichEckhardt 我希望 和 之间有空格,所以混淆是有道理的。namespace::
2赞 Ch3steR 12/16/2021
相关:链接到 cppreference:限定名称查找“如果 :: 的左侧没有任何内容,则查找仅考虑在全局命名空间范围内进行的声明(或通过 using 声明引入全局命名空间)。这使得可以引用这些名称,即使它们被当地声明隐藏了:”
1赞 Ulrich Eckhardt 12/16/2021
@Raildex,我也会使用空格。但是,这里没有必要。在“使用命名空间”中是必要的,因为没有空间,它就会变成一个符号/标记。 但是,它不是上一个令牌的一部分,因此不需要分隔符。此外,出于同样的原因,“::std”中不需要空格。::

答:

7赞 songyuanyao 12/16/2021 #1

它等效于,也等于 。它指的是全局命名空间,并且确实被放在全局命名空间中。using namespace ::std;using namespace std;::std

作为 using 指令的语法:

(强调我的)

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

... ...
nested-name-specifier - 名称和范围解析的序列 运算符 ::,以作用域解析运算符结尾。一个 :: 引用全局命名空间
......

评论

2赞 Peter 12/16/2021
在另一个命名空间中,该命名空间又包含一个名为 的命名空间,并且会产生不同的效果。stdusing namespace stdusing namespace ::std
3赞 Gonen I 12/16/2021 #2

using namespace::stdusing 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;

更新:

正如其中一条注释中所指出的,如果语句位于另一个包含其自己的嵌套命名空间的命名空间中,实际上可能会导致不同的结果。请参阅以下(极不可能)示例:using namespace ::std;using namespace std;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;
}