Както знаем, кодът по-долу е неправилно формиран поради членството 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
е все още неквалифициран погледни нагоре.
Очевидно изпълненията не се държат по този начин и широко се разбира, че обхватът на базовия клас е търсени веднъж, когато шаблонът е инстанцииран.
- Неправилно ли е интерпретирал цитирания абзац?
- Има ли параграф, който определя "правилното" поведение?
Отговори:
7 за отговор № 1Изразите за достъп до класовете (5.2.5. [Expr.ref]) не използват неквалифицирани правила за търсене, използват правила за търсене на достъп до класа (3.4.5 [basic.lookup.classref]).
(2) Ако ID експресия в член на класа достъп (5.2.5) е неквалифициран-ID, както и вида на израза обект е от клас
C
, неквалифицираният идентификатор се търси в обхвата на класаC
.