以下代码可以无错误地编译:
template <typename T> struct A {
void f() { this->whatever; } // whatever is not declared before
};
int main() {
A<int> a;
}
而且我知道这是因为它this是一个依赖于类型的表达式,这使得名称查找whatever被推迟到知道实际的模板参数为止。由于在这种情况下从不使用成员函数f(),因此不A<T>::f存在的实例化,并且从不执行名称查找whatever。
this如果类模板具有类型相关的基础,我可以理解这是类型相关的,例如:
template <typename T> struct B { T whatever; };
template <typename T> struct A : B<T> {
void f() { this->whatever; }
};
int main() {
A<int> a;
}
在解析模板类的定义时A,不可能知道它的基类是什么类型,这this->whatever可能是合法的(B<T>可能有一个名为的成员whatever)。相反,this->whatever在第一个示例中,只要在f某处使用成员函数,我就没有看到任何合法的潜力。
那么,this->whatever在第一个例子中的某些时候可能是合法的吗?如果不是,在这种情况下是否还有其他原因this应该被视为类型相关的表达式?