Какое правило позволяет this-> gt; `получать доступ к членам зависимых базовых классов?

Как мы знаем, приведенный ниже код некорректен, потому что член 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 является еще неквалифицированный уважать.

Очевидно, реализации не ведут себя таким образом, и общепризнанно, что область действия базового класса является искали, как только шаблон создан.

  1. Я неправильно истолковал цитируемый абзац?
  2. Есть ли абзац, в котором указано «правильное» поведение?

15

Решение

Выражения доступа к членам класса (5.2.5. [Expr.ref]) не используют неквалифицированные правила поиска, они используют правила поиска доступа к членам класса (3.4.5 [basic.lookup.classref]).

(2) Если ID-выражение в доступе члена класса (5.2.5) есть безусловный идентификатор и тип объекта выражения
имеет тип класса C, неквалифицированный идентификатор ищется в области видимости класса C,

7

Другие решения


По вопросам рекламы [email protected]