C++为什么这不会导致重新筛选错误?

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()函数中的一个?

注意:请原谅我可怜的英语。

+1

'使用命名空间额外;'不会从命名空间中带入所有内容,它的意思是“当查找一个名称**也**看看该命名空间”。但是因为你有一个地方的'我'的声明,所以没有必要再看。 –

+0

这实际上是一个很好的问题,但并不意味着它可以得到合理的答案。 C++确实有一些奇怪的规则来标识相同的名称和阴影。但它恰好是这样设计的。至少它不像JavaScript那样疯狂。 – VTT

这是本地的。作为一个经验法则,它总是使用“最接近”的定义。

struct A {}; 
int A = 0; 
A b; // not ok, because A is the variable. 

没有错误,因为没有名字i是指在全球范围内的变量,或功能。

使用指令只是告诉编译器,如果在当前上下文中找不到合适的名称,它也应该在该名称空间中查找。在你的情况下,编译器不需要进入extra来查找i,因为它已经在函数i中找到了一个。