Ich habe gelesen Exceptional C++ by Herb Sutter
. Item 32
Außergewöhnliches C++ [Bug]?
Bei Erreichen fand ich die folgende
namespace A
{
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B
{
void f(int i)
{
f(i); // which f()?
}
}
Diese f() nennt sich selbst mit unendlicher Rekursion. Der Grund dafür ist, dass das einzige sichtbare f() B :: f() selbst ist.
Es gibt eine andere Funktion mit der Signatur f (int), nämlich die in Namespace A. Wenn B "mit Namespace A geschrieben hätte;" oder "using A :: f;", dann wäre A :: f (int) als Kandidat sichtbar gewesen, wenn man nach f (int) gesucht hätte, und der f (i) -Aufruf wäre zwischen A :: f mehrdeutig gewesen (int) und B :: f (int). Da B jedoch nicht A :: f (int) in den Gültigkeitsbereich gebracht hat, kann nur B :: f (int) berücksichtigt werden, so dass der Aufruf eindeutig in B :: f (int) aufgelöst wird.
Aber wenn ich folgendes tat ..
namespace A
{
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B
{
using namespace A;
void f(int i)
{
f(i); // No error, why?
}
}
Das heißt Herb Sutter hat es alles falsch? Wenn nicht, warum bekomme ich keinen Fehler?
Nur weil etwas ist kein Fehler bei der Kompilierung, bedeutet nicht, es hat wohldefinierte Semantik. –
Das Schreiben von 'using A :: f' führt jedoch zu einem Kompilierzeitfehler. –
Abhängig von Ihrer Version des Buches ist es bis zu 11 Jahre alt. Änderungen in C++ 03 und bald in C++ 0x werden in den Beispielen nicht berücksichtigt. (Ich weiß es nicht, aber ich vermute, dass es funktionierte, als er es zum ersten Mal schrieb.) – Bill