Namespaces 函数体内部的using指令和函数体外部的using指令有什么区别?

Namespaces 函数体内部的using指令和函数体外部的using指令有什么区别?,namespaces,using-directives,Namespaces,Using Directives,AFAIK ausing指令将名称空间中的所有名称注入最近的封闭名称空间范围。下面是一个我不理解区别的例子: namespace Exercise { int ivar = 0; double dvar = 0; const int limit = 1000; } // using namespace Exercise; void manip() { using namespace Exercise; ++ivar; ++::ivar; }

AFAIK a
using指令
将名称空间中的所有名称注入最近的封闭名称空间范围。下面是一个我不理解区别的例子:

namespace Exercise {
    int ivar = 0;
    double dvar = 0;
    const int limit = 1000;
}

 // using namespace Exercise;

void manip() {
    using namespace Exercise;

    ++ivar;
    ++::ivar;
}
考虑命名空间
练习
,函数
manip
是在全局命名空间范围内定义的。在我看来,函数体内的using指令将名称空间
Exercise
中的所有三个成员名称注入全局范围,并且正好在函数
manip
的定义之前,因此就好像是这样:

int ivar = 0; // injected here
double dvar = 0; // injected here
const int limit = 1000; // injected here

// using namespace Exercise;

void manip() {
    using namespace Exercise;

    ++ivar; // ok using Exercise::ivar
    ++::ivar; // error? 'error: ‘::ivar’ has not been declared; did you mean ‘Exercise::ivar’?
  • 那么,只要该名称已经被注入全局名称空间,为什么
    +::ivar
    就无法编译呢

  • 重要的是:如果我取消注释函数
    manip
    主体之外的第一个using指令,那么代码本身编译得很好,编译器不会抱怨这样的表达式:
    +::ivar

那么,使用指令的两个
之间有什么区别呢