考虑以下代码段:
struct Base{
void f() {}
};
struct Derived: public Base{
void f() { Base::f(); }
};
Derived d;
int main(){
d.f();
}
该片段工作正常。即,d.f()呼叫Base::f()。但我找不到支持这一点的标准的报价。
考虑以下代码段:
struct Base{
void f() {}
};
struct Derived: public Base{
void f() { Base::f(); }
};
Derived d;
int main(){
d.f();
}
该片段工作正常。即,d.f()呼叫Base::f()。但我找不到支持这一点的标准的报价。
以下所有标准参考资料均参考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),不作为注释或示例包装。