众所周知,下面的代码格式错误,因为该成员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的查找仍然是不合格的查找。x
this->x
显然,实现不会以这种方式运行,并且人们普遍认为,一旦模板被实例化,就会搜索基类范围。
- 我是否误解了引用的段落?
- 是否有一段指定“正确”行为的段落?