2

考虑以下代码段:

struct Base{
   void f() {}
};

struct Derived: public Base{
   void f() { Base::f(); }
};

Derived d;
int main(){
    d.f();
}

该片段工作正常。即,d.f()呼叫Base::f()。但我找不到支持这一点的标准的报价。

4

1 回答 1

2

以下所有标准参考资料均参考N4659:2017 年 3 月 Kona 后工作草案/C++17 DIS


这是[class.qual]/1 [摘录,强调我的]:

如果限定 id的嵌套名称说明符指定了一个类,则在嵌套名称说明符之后指定的名称在类的范围内查找[...]

在您的示例中,Base::nested-name-specifier,并且在它之后指定的名称是f(),因此在 class 的范围内对其进行查找Base。此规则不会受到调用站点上的阴影的影响,因为我们使用的是限定名称,并且我们可能会注意到,如果我们f()Base限定 id 中删除将(如预期的限定查找)不会搜索f()派生的范围班级。

struct Base {};

struct Derived: public Base {
   void f() { 
       Base::f();  // error: 'f' is not a member of 'Base
   }
};

我们可能还注意到[class.qual]/3特别提到了这种情况:

如果通过其类的名称后跟 <code>::

但正如@LanguageLawyer 在评论中指出的那样,这一段可以说是非规范性的(1)


(1) [class.qual]/3 给出了 [class.qual]/1 如何应用 / 效果的具体示例。但是,标准中的这些部分通常是非规范性的(示例、注释等),而 [class.qual]/3 没有带来“新的规范性”价值(已在 [class.qual] 中涵盖/1),不作为注释或示例包装。

于 2020-12-04T18:02:26.963 回答