Welche Regel erlaubt "this->" den Zugriff auf Mitglieder abhängiger Basisklassen?

Wie wir wissen, ist der Code unten schlecht geformt, weil das Mitgliedx ist in einer abhängigen Basisklasse. Ändern jedochx zuthis->x in der angezeigten Zeile würde den Fehler beheben.

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();
}

Ich hätte gerne eine Erklärung, wie dieses Verhalten im Standard festgelegt ist. Laut [temp.dep] / 3:

In der Definition einer Klasse oder Klassenvorlage, wenn eine Basisklasse von einem @ abhän template-parameter, Der Gültigkeitsbereich der Basisklasse wird während der Suche nach nicht qualifizierten Namen weder am Definitionspunkt der Klassenvorlage oder des Klassenmitglieds noch während einer Instanziierung der Klassenvorlage oder des Klassenmitglieds geprüft.

Dies scheint zu erklären, warum die Verwendung vonx alleine scheitert. Der Namex wird am Definitionspunkt nachgeschlagen, und der Basisklassenbereich wird nicht untersucht. Was aber, wenn wir @ verwendethis->x? Nun ist der Namex ist abhängig und seine Suche wird bis zur Instanziierung verschoben. Aber der zitierte Absatz scheint zu implizieren, dassx sollte nicht gefunden werdeneven zur Instantiierungszeit, seit dem Nachschlagen vonx imthis->x istimmer noc unqualified Nachsehen

Offensichtlich verhalten sich Implementierungen nicht so, und es ist allgemein bekannt, dass der Basisklassenbereich ist wurde gesucht, sobald die Vorlage instanziiert wurde.

Habe ich den zitierten Absatz falsch interpretiert? Gibt es einen Absatz, der das "richtige" Verhalten angibt?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage