Ich bin sehr verwirrt über die Norm 10.2/13,
[Hinweis: Auch wenn das Ergebnis der Namenssuche eindeutig ist, kann die Verwendung eines Namens, der in mehreren Unterobjekten gefunden wird, mehrdeutig sein (4.11, 5.2.5, 5.3.1, 11.2). end note ] [ Beispiel:
struct B1 {
void f();
static void f(int);
int i;
};
struct B2 {
void f(double);
};
struct I1: B1 { };
struct I2: B1 { };
struct D: I1, I2, B2 {
using B1::f;
using B2::f;
void g() {
f(); // Ambiguous conversion of this
f(0); // Unambiguous (static)
f(0.0); // Unambiguous (only one B2)
int B1::* mpB1 = &D::i; // Unambiguous
int D::* mpD = &D::i; // Ambiguous conversion
}
};
Ich kann nicht erkennen, warum dies eindeutig ist int B1::* mpB1 = &D::i; // Eindeutig
Visual C++, Gcc und CLang sagen alle, dass der Zugriff auf D::i zweideutig ist!
Die Formulierung scheint mit dem Kernproblem #39 zusammenzuhängen http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#39 und der endgültige Vorschlag ist hier zu finden: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1626.pdf
Ich finde nun, dass die neuen, auf dem Algorithmus basierenden Formulierungen (10.2/3-10.2/6) noch verwirrender sind, weil keine der Noten in 10.2/9, 10.2/10, 10.2/11 und 10.2/13 vollständig mit 10.2/3-10.2/6 übereinstimmt. Ich kann 10.2/9-10.2/11 als Ausnahmen betrachten, aber 10.2/13 verwirrt mich besonders. Ich habe keine Ahnung, was mit 10.2/13 bezweckt wird.
Wie ist das Beispiel in 10.2/13 nach den 10.2/3-10.2/6 zu sehen? Was ist die Intention von 10.2/13, d.h., wie ist die Situation, dass 10.2/13 als Ausnahme von 10.2/3-10.2/6 betrachtet wird?
Bitte geben Sie mir einige Hinweise. Ich danke Ihnen vielmals.
Nach einigem Nachdenken scheint mir die Absicht von 10.2/13 klarer zu sein.
int B1::* mpB1 = &D::i; // Eindeutig
Dies sollte eindeutig sein, und die derzeitigen Compiler sind in diesem Punkt falsch. Dies ist eindeutig, weil die Initialisierung von Zeigern auf Klassenmitglieder noch nicht den Zugriff auf das Objekt beinhaltet.
int D::* mpD = &D::i; // Zweideutige Umwandlung
Dies bedeutet, dass bei der Konvertierung von int B1::*mpB1 nach int D::*mpD die Konvertierung aufgrund von mehrdeutigen Basisklassen mehrdeutig ist.