Следующий код может быть скомпилирован без ошибок:
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
следует рассматривать как зависимое от типа выражение в этом случае?