当前位置: 首页 > 知识库问答 >
问题:

未命名命名空间中“使用命名空间”的范围

姜学海
2023-03-14

为什么using指令using namespace std;在包含在匿名命名空间中时表现得好像出现在全局范围?

#include <iostream>

namespace x
{
  using namespace std;
  void g()
  {
    cout << 1;
  }
}

int main()
{
  cout << 1; // compiles fine if `namespace x` is replaced with `namespace`
}

共有1个答案

梁丘烨
2023-03-14

未命名的命名空间相当于实质上写:

namespace __compiler_generated_unique {

}
using namespace __compiler_generated_unique;

这就像在全局范围内有一个using指令。和使用指令是可传递的。

作为规范参考,这里是n4861(C++20标准草案):

[命名空间.未命名]

1未命名名称空间定义的行为就好像它被替换为

inline namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

内联出现的条件是且仅当它出现在unnamed-namespace-definition中,并且转换单元中unique的所有出现都被相同的标识符替换,并且该标识符与转换单元中的所有其他标识符不同。unnamed-namespace-definition中的可选属性-specifier-seq属于unique

[namespace.udir]

4对于非限定查找([basic.lookup.unqual]),using-指令是可传递的:如果一个作用域包含一个using-指令,该指令指定了一个本身包含using-指令的第二个命名空间,其效果就好像来自第二个命名空间的using-指令也出现在第一个命名空间中。

 类似资料:
  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 这篇文章描述了如何在TypeScript里使用命名空间(之前叫做“内部模块”)来组织你的代码

  • Let the word of Christ dwell in you richly in all wisdom; teaching and admonishing one another in psalms and hymns and spiritual songs, singing with grrace in your hearts tto the Lord. And whatsoever

  • 客户端有许多“命名空间”,通常是一些公开的可管理功能。命名空间对应 Elasticsearch 中各种可管理的 endpoint。下面是全部的命名空间: **命名空间** **功能** `indices()` 索引数据统计和显示索引信息 `nodes()` 节点数据统计和显示节点信息 `cluster()` 集群数据统计和显示集群信息 `snapshot()` 对集群和索引进行拍摄快照或恢复数据

  • 命名空间 由于 js 环境极少命名空间管理模块, namespace 相对陌生, 比如有这样的文件结构, src/ demo/ core.cljs 可以看到 core.cljs 的路径就是: src/demo/core.cljs 注意 JVM 环境有个 classpath 的环境变量, 用于判断怎样查找源码, classpath 对应多个路径, 也可能是 jar 包, 而 jar 包中

  • 命名空间,英文名字:namespaces 在研习命名空间以前,请打开在python的交互模式下,输入:import this >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than

  • Swoole提供了完善的进程管理机制,当Worker进程异常退出,如发生PHP的致命错误、被其他程序误杀,或达到max_request次数之后正常退出。主进程会重新拉起新的Worker进程。 Worker进程内可以像普通的apache+php或者php-fpm中写代码。不需要像Node.js那样写异步回调的代码。 主进程内的回调函数: onStart onShutdown onTimer Work