下面的代码进行编译:
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::C
和x::y::x::C
不同,但有时会令人困惑。
为什么在C ++中允许x::y::x
?禁止这样做是否更清楚?
答案 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(可能还有其他编译器)会发出警告,因此通过阅读编译器警告可以为您提供帮助。