Der Aufruf an foo(true)
in Ihrem Programm ist, wie Sie sagen, eindeutig mehrdeutig; außerdem ist es gemäß dem Algorithmus, der in § 10.2 präsentiert wird, mehrdeutig und folglich sollte es bei Verwendung gekennzeichnet werden. (Die Kennzeichnung der using
Deklaration wäre falsch; 10.2 (1) gibt eindeutig an, dass mehrdeutige Verwendungen von Namen beim Nachschlagen und nicht bei der Deklaration gekennzeichnet werden.)
Es ist interessant, dieses Programm mit einem ähnlichen Programm zu vergleichen, das Gegenstand von ein a recognized gcc bug (etwas von diesem Bug-Report modifiziert, um die parallel deutlicher zu machen):
#include <iostream>
struct A {
static int foo() {return 1;}
static int foo(char) { return 2;}
};
struct B1 : A {
// using A::foo;
};
struct B2 : A {
// using A::foo;
};
struct C : B1, B2 {
// using B1::foo;
// using B2::foo;
};
int main()
{
std::cout << C::foo();
}
Das obige Programm korrekt ist; Trotz der Diamantvererbung ist foo
ein statisches Element von A
, also ist es nicht mehrdeutig. In der Tat kompiliert gcc es ohne Probleme. Das Auskommentieren der beiden Instanzen von using A::foo
, die nichts an foo
ändert, bewirkt jedoch, dass gcc den im Fehlerbericht notierten merklich redundanten Fehler erzeugt. Wenn Sie die beiden using
Deklarationen innerhalb C
dekommentieren, was vermutlich den anderen Fehler auslöst, der Gegenstand dieser Frage ist, wird der Fehler static function
maskiert und das Programm wird erneut kompiliert.
Clang scheint alle möglichen Varianten dieses Programms zu behandeln, für das, was es wert ist.
Schließlich ist zu beachten, dass eine explizit foo(bool)
innerhalb C
erklärt (im ursprünglichen Programm) wird jeder foo(bool)
in C
‚s Umfang von using
Erklärungen gebracht siegen über. Ich vermute, dass diese beiden Bugs das Ergebnis einer schlechten Buchführung sind, während sie versuchen, die verschiedenen Funktionsdeklarationen im Umfang jeder Klasse und ihre individuelle Herkunft zu verfolgen (als eine Folge von using
Deklarationen und Funktionsdeklarationen).
Erstellung fehlgeschlagen auf VC11. Mehrdeutiger Aufruffehler. –
@MarkGarcia: Ja, es scheint nur GCC akzeptiert es.Die Frage ist, ob dies auf einen Fehler zurückzuführen ist oder ob keine Diagnose für diese Art von Fehler erforderlich ist. –
FWIW, g ++ 4.4.3 gibt einen Fehler, aber nicht, wenn 'foo' in' main' verwendet wird, aber auf 'using's in' C' bereits: 'ambig.cc:9: error: using declaration 'mit B2 :: foo 'steht in Konflikt mit einer vorherigen using-Deklaration – us2012