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

Bri*_*ian 15 c++ templates dependent-name language-lawyer name-lookup

我们知道,下面的代码格式错误,因为该成员x位于依赖基类中.但是,更改xthis->x指示的行将修复错误.

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();
}
Run Code Online (Sandbox Code Playgroud)

我想解释一下标准中如何指定这种行为.根据[temp.dep]/3:

在类或类模板的定义中,如果基类依赖于模板参数,则在类模板或成员的定义点或在实例化实例化期间,不会在非限定名称查找期间检查基类作用域.类模板或成员.

这似乎解释了为什么x单独使用失败.x在定义点查找名称,不检查基类范围.但是,如果我们使用this->x怎么办?现在名称x是依赖的,其查找被推迟到实例化.但引用的段落似乎暗示即使在实例化时x也不应该找到,因为查找xin 仍然this->x不合格的查找.

显然,实现不会以这种方式运行,并且人们普遍认为,一旦模板被实例化,就会搜索基类范围.

  1. 我误解了引用的段落吗?
  2. 是否有一个段落指定"正确"的行为?

n. *_* m. 7

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

(2)如果类成员访问(5.2.5)中的id-expression是非限定id,并且对象表达式的类型是类类型C,则在类的范围内查找unqualified-id C.