gpt4 book ai didi

c++ - 嵌套名称说明符中第一个 namespace 名称的名称查找?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:02 25 4
gpt4 key购买 nike

在没有任何类、模板、枚举或 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
}

在上面的示例中,AX,但是我的问题是关于一般情况。

如何在 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.
}

http://ideone.com/NaEIVd

实际上不推荐利用这个漏洞;如果 X 是类类型的对象,那么 X::iX.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-namenamespace-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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com