2012-08-08 18 views
9

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; 
    } 
}; 

risposta

8

Argument dependent lookup.

Nella chiamata foobar(f) verranno considerate le funzioni dal namespace di Foo.

Non funziona per double perché tale tipo non è dichiarato in alcun spazio dei nomi.

+0

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

+0

Grazie Bo. Il collegamento ad ADL chiarisce le cose. – user2023370

+0

@Xeo: Non implicherebbe che la chiamata a 'foobar (f)' fallirebbe nel trovare 'foobar (Bar b)'? – user2023370