/ / Какво е правилото, което позволява "това->" да има достъп до членове на зависими основни класове? - C ++, шаблони, език-адвокат, име-търсене, зависимо-име

Какво е правилото, което позволява "това->" да има достъп до членове на зависими базови класове? - C ++, шаблони, език-адвокат, име-търсене, зависимо-име

Както знаем, кодът по-долу е неправилно формиран поради членството 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:

В дефиницията на шаблон за клас или клас, ако базовият клас зависи от a шаблон параметър, базовия клас Обхватът не се разглежда при търсенето на невалидни имена или в точката на дефиниране на шаблона на класа или член или по време на инстанцииране на шаблона или члена на класа.

Това изглежда обяснява защо ползването x сам проваля. Името x се преглежда в точката на дефиниция и обхватът на базовия клас не се разглежда. Все пак, какво ще стане, ако използваме this->x? Сега името x е зависима и търсенето й е отложено до присвояване. Но цитираният абзац изглежда предполага това x не трябва да се намери дори при конкретно време, от търсенето на x в this->x е все още неквалифициран погледни нагоре.

Очевидно изпълненията не се държат по този начин и широко се разбира, че обхватът на базовия клас е търсени веднъж, когато шаблонът е инстанцииран.

  1. Неправилно ли е интерпретирал цитирания абзац?
  2. Има ли параграф, който определя "правилното" поведение?

Отговори:

7 за отговор № 1

Изразите за достъп до класовете (5.2.5. [Expr.ref]) не използват неквалифицирани правила за търсене, използват правила за търсене на достъп до класа (3.4.5 [basic.lookup.classref]).

(2) Ако ID експресия в член на класа достъп (5.2.5) е неквалифициран-ID, както и вида на израза обект е от клас C, неквалифицираният идентификатор се търси в обхвата на класа C.