为什么C ++允许使用相同名称的嵌套名称空间?

时间:2019-08-02 12:24:27

标签: c++ namespaces

下面的代码进行编译:

namespace x
{
namespace y
{
    namespace x
    {
    struct C
    {
    C ()
    {
    std::cout << "x::y::z::C" << std::endl;
    }
    };
    }
}
struct C
{
    C ()
    {
    std::cout << "x::C" << std::endl;
    }
};
}

x::Cx::y::x::C不同,但有时会令人困惑。

为什么在C ++中允许x::y::x?禁止这样做是否更清楚?

2 个答案:

答案 0 :(得分:3)

  

为什么在C ++中允许使用x :: y :: x?禁止这样做是否更清楚?

没有冒犯,但我认为您的前提存在严重缺陷。

也许您没有注意到,但是在不同的嵌套级别使用相同的名称是很自然的。考虑构造函数。类foo的构造函数的完全限定名称为foo::foo()。没什么不寻常的吗?

现在,如果要将类放在名为foo的命名空间中,该怎么办。我并不是在说这是最好的命名方案,但是从我的头顶上,我也没有看到完全禁止它的理由。构造函数将是foo::foo::foo()

拥有禁止这种命名的规则会对想要使用这种命名方案的人(可能次优,但仅是意见)造成极大的挫败感,而对于不想使用这种命名的人则绝对为零。总共没有好处。

答案 1 :(得分:1)

类似于在不同作用域中具有相同名称的变量。技术上有效。毕竟,在汇编级别没有名称,只有指针和大小。

void foo()
{
 int x = 1;
 if (true)
  {
   int x = 2;
   x = 3; // Whops
  }
}

C ++并不是一种宽容的语言,如果您搞砸了任何事情,包括变量命名,那您就一个人了。如果您希望使用这种语言来拯救您,可以选择其他多种语言。

也就是说,当声明的变量在外部范围内隐藏另一个变量时,MSVC(可能还有其他编译器)会发出警告,因此通过阅读编译器警告可以为您提供帮助。