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