我们知道,下面的代码格式错误,因为成员 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
,因为在 this->x
中查找 x
仍然是 unqualified 查找 .
很明显,实现并不广泛地理解,一旦模板被实例化,就会搜索基类范围 .
-
我是否误解了引用的段落?
-
是否有指定"correct"行为的段落?
1 回答
类成员访问表达式(5.2.5 . [expr.ref])不使用非限定查找规则,它们使用类成员访问查找规则(3.4.5 [basic.lookup.classref]) .