以下代码可以无错误地编译:
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
应该被视为类型相关的表达式?