- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在没有任何类、模板、枚举或 typedef 的翻译单元中给定嵌套名称说明符 A::
,如果格式正确,标识符 A
必须引用命名空间。
例如:
namespace X
{
int i;
}
int main()
{
X::i = 42; // Here X:: is a nested-name-specifier
// and X is a namespace-name
// i is looked up qualified w.r.t. X
}
在上面的示例中,A
是 X
,但是我的问题是关于一般情况。
如何在 A::
中查找 namespace 名称 A
?
名称查找规则在 3.4 中进行了总结,但我不清楚在这种情况下如何(或哪些规则)适用。
例如,A
的查找是非限定名称查找吗? 3.4.1适用吗?
换句话说:在哪些命名空间中搜索名为 A
的命名空间,搜索顺序是什么?您是如何从标准中得出这一结论的?
最佳答案
是的,A
是根据 3.4.1 进行的常规非限定名称查找,连续搜索包含嵌套名称说明符的范围,除了只找到类和命名空间名称。例如,你可以这样:
int main()
{
int X;
X::i = 42; // OK, int X not found.
}
实际上不推荐利用这个漏洞;如果 X
是类类型的对象,那么 X::i
和 X.i
可能是完全不同的东西。
要从标准中得出这个结论,请从 3.4.3(限定查找,这是我们最终要分析的高级构造)开始,它在第 1 段中说,
The name of a class or namespace member or enumerator can be referred to after the :: scope resolution operator (5.1) applied to a nested-name-specifier that denotes its class, namespace, or enumeration. If a :: scope resolution operator in a nested-name-specifier is not preceded by a decltype-specifier, lookup of the name preceding that :: considers only namespaces, types, and templates whose specializations are types. If the name found does not designate a namespace or a class, enumeration, or dependent type, the program is ill-formed.
继续阅读第 2 段,它不适用,因为没有声明 qualified-id。其余段落同样指定了不适用的异常(exception)情况。那么,::
之前的内容是什么?引用语法。
nested-name-specifier:
::
type-name ::
namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id ::
只有 type-name::
和 namespace-name::
符合我们的先验标准。这些也与我们目前发现的重叠。 type-name
或 namespace-name
通常如何在特定上下文中解析?不合格的查找。继续3.4.1。
首先,3.4.1/1 是要牢记的一般规则:
In all the cases listed in 3.4.1, the scopes are searched for a declaration in the order listed in each of the respective categories; name lookup ends as soon as a declaration is found for the name. If no declaration is found, the program is ill-formed.
下一个适用的段落是 6:
A name used in the definition of a function following the function’s declarator-id that is a member of namespace N (where, only for the purpose of exposition, N could represent the global scope) shall be declared before its use in the block in which it is used or in one of its enclosing blocks (6.3) or, shall be declared before its use in namespace N or, if N is a nested namespace, shall be declared before its use in one of N’s enclosing namespaces.
这条规则并没有告诉我们实际上在全局命名空间中搜索名称,但它确实在列表和段落中提到了函数的封闭命名空间(在本例中是全局命名空间) 1 表示搜索列出的 namespace 。所以这足以构建名称查找。
令人惊讶的是,它没有提到递归搜索优先考虑内部封闭的命名空间,但您的示例中实际上没有这样的事情,所以我会在这里停下来:)。将编译留给编译器进行,并且仅在出现问题时手动工作要快得多。
关于c++ - 嵌套名称说明符中第一个 namespace 名称的名称查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437073/
大家好:我正在尝试创建一个命名空间,以便我可以在整个应用程序中的不同 CoffeeScript 文件中使用一个类(至少这是我对命名空间用途的理解) 我在这里找到了一个很好的例子:Classes wit
我想使用两个字符串(我不知道它们的内容)来创建两个 namespace 。如果 namespace 存在,我不想创建一个新的 namespace 。这是我的代码: function createNam
在 Struts 2 中,我看到根命名空间提供与根命名空间相同的行为,即充当“包罗万象”。我需要限制我的应用程序中的操作只能从一个 URL 访问,包括 URL 中没有 namespace 的操作。我的
我想在旧的代码库中包含新的 SASS。考虑到已经编写的新样式,我如何避免新样式泄漏。 例如 .box width: 100% // ... .tab display: inline-blo
我的\命名空间 \My\Namespace 那么,我应该使用哪一个,我看到了 php documentation主要使用 My\Namespace。 但据说 \My\Namespace 更好,因为没有
我正在研究 Rails 2.3.8。我的 environment.rb 中有以下内容 config.gem "redis" config.gem "redis-namespace", :lib =>
我有一个包含一些类型定义的小命名空间,我用它来使我的代码看起来更简洁。但是,我不想在每个使用这些类型之一的文件中添加“using namespace ...”行,毕竟我已经必须为文件添加 #inclu
如何获取 MediaWiki namespace 列表?最好有姓名和号码。 最佳答案 使用API:api.php?action=query&meta=siteinfo&siprop=namespa
为了使用“namespace import *”命令在不同的命名空间中使用该命名空间的变量/过程,“命名空间导出...”是否是必需的。我们真的应该在源命名空间中进行“导出”并在目标命名空间中进行“导入
假设我有以下 list ,例如部署,服务和入口。在默认 namespace 中,一切正常。虽然我想将资源投入到用manifest.yaml创建的另一个命名空间。我以为如果我写了 kubectl app
我想以编程方式将一个类从一个命名空间移动到另一个命名空间。这包括调整移动类在其先前命名空间中的任何依赖项。 我猜我可以以某种方式利用 Roslyn 项目,但我找不到起点。 编辑: 我正在尝试在 C#
Spring不同类型的注入方式 spring官网代码示例 1、不同类型的注入方式 <?xml version="1.0" encoding="UTF-8&qu
我想知道,考虑到这段代码: namespace A\B; use A\B as AB; use \Z\V as ZV; // another used namespace class Merry {
我正在研究一个似乎一切都很好的“董事会”类(class)。不知何故,在其他类(class)上工作了大约一个小时后,Board 在错误方面表现出一些非常奇怪的行为。 //headerfile #prag
我尝试在 TYPO3 扩展中创建多个 ViewHelper。 但是现在我尝试将 ViewHelper 放在子目录中,例如 扩展\类\ View 助手\自定义。 ViewHelper 的新
我的情况是:日历属于客户或销售员 因为我还有像 Event 和 File 这样的类,所以我将命名空间 App\Models 用于我所有的模型类。 所以我设置了多态关系: 在日历.php public
所有 Less 文档和教程都使用 #namespace > .mixin()当它进入命名空间时的语法。但是我发现自己更习惯于 .namespace.mixin()语法,即: .namespace()
我正在尝试使用 MS Robotics Studio 和 VS 2008 构建 DSS 服务,但是在构建时,我收到来自 dssproxy.exe 的错误消息: The class MyServ
例如,我们有两个用于解析简历的类,一个用于解析Excel,另一个用于解析HTML。我的同事们喜欢做的就是将这两个类命名为相同的名称,并将它们放在不同的命名空间中,如下所示: namespace XX.
我的库的所有类都在一个命名空间中定义。当我为 Doxygen 创建主页时,我必须在注释中明确使用这个命名空间来让 Doxygen 生成链接。我想对整个注释块使用“使用命名空间”之类的东西。 一个例子:
我是一名优秀的程序员,十分优秀!