Namespaces 函数体内部的using指令和函数体外部的using指令有什么区别?
AFAIK aNamespaces 函数体内部的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; }
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
- 重要的是:如果我取消注释函数
主体之外的第一个using指令,那么代码本身编译得很好,编译器不会抱怨这样的表达式:manip
+::ivar
之间有什么区别呢