关于c ++:允许`this->`访问依赖基类成员的规则是什么?

What is the rule that allows `this->` to access members of dependent base classes?

如我们所知,下面的代码格式不正确,因为成员x位于从属基类中。但是,将所示行上的x改为this->x将修复错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
struct B {
    int x;
};
template <typename T>
struct C : B<T> {
    void f() {
        int y = x; // Error!
    }
};
int main() {
    C<int> c;
    c.f();
}

我想解释一下标准中如何规定这种行为。根据[温度差]/3:

In the definition of a class or class template, if a base class depends on a template-parameter, the base class
scope is not examined during unqualified name lookup either at the point of definition of the class template
or member or during an instantiation of the class template or member.

这似乎可以解释为什么单独使用x失败。名称x是在定义点上查找的,并且不检查基类范围。但是,如果我们使用this->x会怎么样?现在名称x是依赖的,它的查找被推迟到实例化。但引用的段落似乎暗示即使在实例化时也不能找到x,因为在this->x中查找x仍然是不合格的查找。

显然,实现的行为不是这样的,而且广泛理解的是,一旦模板被实例化,就会搜索基类范围。

  • 我是否误解了引用的段落?
  • 是否有一段规定了"正确"的行为?

  • 类成员访问表达式(5.2.5.[expr.ref])不使用非限定的查找规则,它们使用类成员访问查找规则(3.4.5[basic.lookup.classref])。

    (2) If the id-expression in a class member access (5.2.5) is an unqualified-id, and the type of the object expression
    is of a class type C, the unqualified-id is looked up in the scope of class C.