Bri*_*ian 15 c++ templates dependent-name language-lawyer name-lookup
我们知道,下面的代码格式错误,因为该成员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();
}
Run Code Online (Sandbox Code Playgroud)
我想解释一下标准中如何指定这种行为.根据[temp.dep]/3:
在类或类模板的定义中,如果基类依赖于模板参数,则在类模板或成员的定义点或在实例化实例化期间,不会在非限定名称查找期间检查基类作用域.类模板或成员.
这似乎解释了为什么x单独使用失败.x在定义点查找名称,不检查基类范围.但是,如果我们使用this->x怎么办?现在名称x是依赖的,其查找被推迟到实例化.但引用的段落似乎暗示即使在实例化时x也不应该找到,因为查找xin 仍然this->x是不合格的查找.
显然,实现不会以这种方式运行,并且人们普遍认为,一旦模板被实例化,就会搜索基类范围.
类成员访问表达式(5.2.5.[expr.ref])不使用非限定查找规则,它们使用类成员访问查找规则(3.4.5 [basic.lookup.classref]).
(2)如果类成员访问(5.2.5)中的id-expression是非限定id,并且对象表达式的类型是类类型
C,则在类的范围内查找unqualified-idC.