Nel codice C++ riportato di seguito, foobar
viene definito per primo un singolo parametro double
e quindi nuovamente per un singolo parametro di tipo Foo
. Entrambi sono definiti all'interno del namespace globale.Accesso al namespace globale C++ dall'interno di un altro namespace
All'interno dello spazio dei nomi one
, viene definito un ulteriore sovraccarico di foobar
, con un singolo parametro di tipo Bar
. Da questa versione di foobar
, una chiamata non qualificata a foobar
con un argomento double
(42.0) avrà esito negativo. Una chiamata simile a foobar
, questa volta qualificata con l'operatore di risoluzione (: :) scope, anche con un argomento double
, avrà comunque esito positivo.
D'altra parte, una chiamata non qualificata a foobar
, con un argomento di tipo Foo
, ha esito positivo. Anche una chiamata a foobar
con un argomento , qualificata dall'operatore di risoluzione dell'ambito, ha esito positivo.
Perché i due scenari si comportano in modo diverso? Io uso sia gcc 4.7 che clang ++ 3.2.
struct Foo {};
struct Bar {};
double foobar(double x) { return x; }
Foo foobar(Foo f) { return f; }
namespace one {
Bar foobar(Bar b) {
//foobar(42.0); // error: can't convert to Bar
::foobar(42.0);
Foo f;
foobar(f); // no problem
::foobar(f);
return b;
}
};
Come aggiunta all'ultima frase: La ricerca di nome non qualificato si interrompe non appena trova un nome * corrispondente *, considerando prima gli ambiti locali e solo se non trova alcun nome lì cercherà gli ambiti superiore e globale . – Xeo
Grazie Bo. Il collegamento ad ADL chiarisce le cose. – user2023370
@Xeo: Non implicherebbe che la chiamata a 'foobar (f)' fallirebbe nel trovare 'foobar (Bar b)'? – user2023370