使用指令理解命名空间

时间:2015-01-23 05:00:44

标签: c++ namespaces

在以下程序中,我们有两个名称空间:

#include <iostream>
namespace B
{
    int c = 42;
}

namespace A
{
    using namespace B;
    int a = 442;
}

namespace B
{
    int b = 24;
}

int main()
{ 
    std::cout << A::a << std::endl; //442
    std::cout << A::b << std::endl; //24
    std::cout << A::c << std::endl; //42
}

DEMO

我认为N4296::3.3.6/1 [basic.scope.namespace]

涵盖了该计划的行为
  

命名空间成员名称具有命名空间范围。它的潜在范围   从名称的声明点(3.3.2)包括其命名空间   向前;和为每个使用指令(7.3.4)提名   成员的名称空间,成员的潜在范围包括该部分   后面的using指令的潜在范围   成员的声明要点

因此,在namespace A的情况下,成员b的潜在范围不应该包含程序的任何部分,因为成员后来被声明为{{1} }。但实际上它可以通过限定名称查找找到。怎么了?

1 个答案:

答案 0 :(得分:2)

如果您再次阅读此片段:

  

成员的[b]潜在范围包括在成员的声明点之后的使用指令[in A]的潜在范围部分。

我相信您必须将其视为bA声明之后的b范围内。在您打印A::b的地方,实际上“遵循会员的声明点”,因此对于该行,b可以在A的范围内找到。这完全有效。