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

问题描述

AFAIK a using directive 将命名空间中的所有名称注入最近的封闭命名空间范围。这是一个我不明白其中区别的示例:

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

 // using namespace Exercise;

void manip() {
    using namespace Exercise;

    ++ivar;
    ++::ivar;
}

考虑命名空间 Exercise函数 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?

那么这两个 using directives 有什么区别?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)