Какое правило позволяет `this->` обращаться к членам зависимых базовых классов?
Как мы знаем, приведенный ниже код некорректен, потому что член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
не должен быть найдендаже во время создания экземпляра, с момента поискаx
вthis->x
являетсяеще неквалифицированный уважать.
Очевидно, реализации не ведут себя таким образом, и общепризнанно, что область действия базового классаявляется искали, как только шаблон создан.
Я неправильно истолковал цитируемый абзац?Есть ли абзац, в котором указано «правильное» поведение?