类作用域内的限定名称查找

4
从3.4.3.1/1中有这样一句话:
如果限定符标识符的嵌套名称指定了一个类,则在嵌套名称指定符之后指定的名称将在该类的范围内查找。
但是在3.4.3.1/1中进一步说明:
名称应该代表该类或其基类之一的一个或多个成员。
而在3.3.8/1中又说:
在类中声明的名称的潜在作用域不仅包括名称的声明位置后面的声明区域,还包括该类中所有函数体、默认参数、异常规范以及非静态数据成员的初始化列表(包括嵌套类中的这些内容)。
这意味着基类不包含在派生类的作用域中。因此,需要重新修订3.4.3.1/1:
如果限定符标识符的嵌套名称指定了一个类,则在嵌套名称指定符之后指定的名称将在该类的范围和其基类的范围内查找。
我理解的对吗?

一个小的代码示例可以帮助理解问题! - TemplateRex
@TemplateRex 我认为没有合适的代码示例 :). 我的问题是纯理论性的。 - user2953119
应该有一个代码示例,其中一个解释会找到不同的名称而另一个解释则不同。 - TemplateRex
1个回答

2

不,你是错误的。

你忘记的是,在类的作用域中查找名称时,要在该类的直接基类中声明的名称中进行查找,正如10.2p5所述。

10.2p5 成员名称查找 [class.member.lookup]

否则(即C不包含f的声明或结果声明集为空),则S(F,C)最初为空。 如果C具有基类,则在每个直接基类子对象B_i中计算f的查找集,并依次将每个这样的查找集S(F,B_i)合并到S(F,C)中。


简单解释

上面的引用可能看起来过于复杂,但它描述了在C的作用域内查找名称f的方法。如果C中没有任何声明具有名称f,则搜索将继续包括在C的任何直接基类中声明的那些名称。

(注意:措辞是递归的,如果在C的直接基类中找不到名称f,则还要搜索C的基类的基类)


你的意思是,引用如果限定符标识符的嵌套名指示符指示一个类,则在嵌套名指示符之后指定的名称将在该类的作用域中查找声明必须被解释为首先要查找的作用域是由_nested-name-spcifier_明确指定的类。如果没有找到合适的声明,则继续在基类的作用域中查找。我理解得对吗? - user2953119

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接