Как мы знаем, приведенный ниже код некорректен, потому что член 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
является еще неквалифицированный уважать.
Очевидно, реализации не ведут себя таким образом, и общепризнанно, что область действия базового класса является искали, как только шаблон создан.
Выражения доступа к членам класса (5.2.5. [Expr.ref]) не используют неквалифицированные правила поиска, они используют правила поиска доступа к членам класса (3.4.5 [basic.lookup.classref]).
(2) Если ID-выражение в доступе члена класса (5.2.5) есть безусловный идентификатор и тип объекта выражения
имеет тип классаC
, неквалифицированный идентификатор ищется в области видимости классаC
,