Ho letto Exceptional C++ by Herb Sutter
. Al raggiungimento Item 32
Eccezionale C++ [Bug]?
ho trovato il seguente
namespace A
{
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B
{
void f(int i)
{
f(i); // which f()?
}
}
Questo f() chiama se stessa, con ricorsione infinita. Il motivo è che l'unica f visibile() è B :: f() stesso.
C'è un'altra funzione con firma f (int), ovvero quella nel namespace A. Se B ha scritto "utilizzando il namespace A;" o "using A :: f;", quindi A :: f (int) sarebbe stato visibile come candidato durante la ricerca di f (int) e la chiamata f (i) sarebbe stata ambigua tra A :: f (int) e B :: f (int). Poiché B non ha portato A :: f (int) in ambito, tuttavia, solo B :: f (int) può essere considerato, quindi la chiamata risolve in modo univoco su B :: f (int).
Ma quando ho fatto la seguente ..
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?
}
}
Ciò significa Herb Sutter ha sbagliato tutto? Se no, perché non ottengo un errore?
Solo perché qualcosa non è un errore di compilazione non significa che deve semantica ben definita. –
Ma scrivere 'usando A :: f' porta a compilare l'errore di tempo. –
A seconda della versione del libro, ha fino a 11 anni. Qualsiasi modifica in C++ 03 e presto in C++ 0x non si rifletterà nei suoi esempi. (Non lo so, ma sospetto che abbia funzionato quando l'ha scritto per la prima volta.) – Bill