众所周知,下面的代码格式错误,因为该成员x位于依赖基类中。但是,更改x为this->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();
}
我想解释一下标准中如何指定这种行为。根据 [temp.dep]/3:
在类或类模板的定义中,如果基类依赖于模板参数,则在非限定名称查找期间,无论是在类模板或成员的定义点还是在类模板或成员的实例化期间,都不会检查基类范围类模板或成员。
这似乎解释了为什么x单独使用会失败。x在定义点查找名称,不检查基类范围。但是,如果我们使用this->x? 现在名称x是依赖的,它的查找被推迟到实例化。但是引用的段落似乎暗示即使在实例化时x也不应该找到,因为in的查找仍然是不合格的查找。xthis->x
显然,实现不会以这种方式运行,并且人们普遍认为,一旦模板被实例化,就会搜索基类范围。
- 我是否误解了引用的段落?
- 是否有一段指定“正确”行为的段落?