微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决函数体内部的 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 举报,一经查实,本站将立刻删除。