代码之家  ›  专栏  ›  技术社区  ›  Kit Fisto

“使用名称空间”在C++中是可传递的吗?

  •  4
  • Kit Fisto  · 技术社区  · 7 年前

    令我惊讶的是,以下代码在VC++2017上编译并打印了“X”:

    #include <string>
    #include <iostream>
    
    
    namespace A {
        using namespace std;
    }
    
    namespace B {
        using namespace A;
    }
    
    namespace C {
        using namespace B;
        string a;
    }
    
    int main()
    {
        C::a = "X";
        std::cout << C::a;
        return 0;
    }
    

    看起来像 using namespace std 从命名空间A到命名空间B再到命名空间C。

    这是Visual C++中的一个bug还是与语言规范一致?

    我早就料到了 使用命名空间std 结束于封闭范围的末尾,该范围位于命名空间A定义的末尾。

    编辑:我知道 this question 也回答了我的问题。但这篇文章更多地是关于匿名名称空间的,而这篇文章是关于使用名称空间指令的可传递性的。所以我认为这是一个更好的例子,这个问题很有意义。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Lightness Races in Orbit    7 年前

    对:

    [C++14: 7.3.4/4]: 对于不合格查找(3.4.1), 这个 使用指令 是可传递的 :如果作用域包含 使用指令 它指定第二个名称空间,该名称空间本身包含 使用指令 ,其效果就像第二个命名空间中的using指令也出现在第一个命名空间中一样。 [..]

    因此,编译器是正确的; using namespace 这里有效地将名称导入到封闭的命名空间中:

    [C++14: 7.3.4/2]: A. 使用指令 指定指定命名空间中的名称可以在 使用指令 显示在 使用指令 . [..]

    这里的“范围”是名称空间的范围;作用域的内容不会因为 } 遇到。不过,对块范围的熟悉有时会让人有这种感觉。