C++为什么这不会导致重新筛选错误?
问题描述:
#include <iostream>
using namespace std;
namespace extra
{ int i; }//Declared an integer i here
void i()
{
using namespace extra;
int i; //We called namespace extra at above then we declared another i
i=9;
cout<<i;
}
int main()
{
enum letter{i,j};
class i{letter j;};
::i();
return 0;
}
正如我在上面的注释中所解释的,我们首先在名称空间声明一个整数i,然后在调用它之后我们声明另一个整数然后给它一个值9.我的问题是为什么这不会导致重新指定错误?也在代码行C++为什么这不会导致重新筛选错误?
i=9;
我的价值获得值9?命名空间中的一个还是void i()函数中的一个?
注意:请原谅我可怜的英语。
答
这是本地的。作为一个经验法则,它总是使用“最接近”的定义。
struct A {};
int A = 0;
A b; // not ok, because A is the variable.
没有错误,因为没有名字i
是指在全球范围内的变量,或功能。
使用指令只是告诉编译器,如果在当前上下文中找不到合适的名称,它也应该在该名称空间中查找。在你的情况下,编译器不需要进入extra
来查找i
,因为它已经在函数i
中找到了一个。
'使用命名空间额外;'不会从命名空间中带入所有内容,它的意思是“当查找一个名称**也**看看该命名空间”。但是因为你有一个地方的'我'的声明,所以没有必要再看。 –
这实际上是一个很好的问题,但并不意味着它可以得到合理的答案。 C++确实有一些奇怪的规则来标识相同的名称和阴影。但它恰好是这样设计的。至少它不像JavaScript那样疯狂。 – VTT