【问题标题】:What is "using namespace::std" in C++什么是 C++ 中的“使用命名空间::std”
【发布时间】:2022-01-19 07:22:24
【问题描述】:

我正在阅读其他人的一些代码sn-ps,我发现了一行:

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}

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

【问题讨论】:

  • 你能在一些实际编译的代码的上下文中展示这个吗?
  • 您可以使用:: 表示某些内容来自全局命名空间。 ::std 表示 std 嵌套在全局命名空间中,就这么简单。
  • @UlrichEckhardt 我希望在namespace:: 之间有一个空格,所以这种混淆是有道理的。
  • Related: link to cppreference: Qualified name lookup "如果 :: 左侧没有任何内容,则查找仅考虑在全局命名空间范围内(或引入使用声明的全局命名空间)。这使得即使它们被本地声明隐藏,也可以引用这些名称:"
  • 我也会使用空格,@Raildex。但是,这里没有必要。在“使用命名空间”中是必要的,因为没有空格,它会变成一个符号/令牌。 :: 不是前一个令牌的一部分,因此不需要分隔符。此外,出于同样的原因,“::std”中不需要空格。

标签: c++ namespaces using-directives


【解决方案1】:

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;

更新:

如其中一个 cmets 中所述,如果语句位于包含其自己的嵌套命名空间 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;
}

【讨论】:

    【解决方案2】:

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

    作为using-directives的语法:

    (强调我的)

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

    ... ...
    嵌套名称说明符 - 名称序列和范围解析 运算符 ::, 以范围解析运算符结尾。一个:: 指的是全局命名空间
    ... ...

    【讨论】:

    • 在另一个命名空间中,该命名空间又包含名为stdusing namespace stdusing namespace ::std 的命名空间会产生不同的效果。
    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2010-11-15
    • 2017-04-25
    • 2010-12-02
    • 2011-01-14
    相关资源
    最近更新 更多