2011-02-07 19 views

risposta

3

L'iniziale "::" si riferisce allo spazio dei nomi globale. Supponiamo che tu dica namespace foo { .... Quindi std::Bar fa riferimento a foo::std::Bar, mentre ::std::Bar fa riferimento a std::Bar, che è probabilmente l'intenzione dell'utente. Quindi, includendo sempre l'iniziale "::" puoi proteggerti dal riferimento allo spazio dei nomi sbagliato, se non sei sicuro di quale spazio dei nomi sei attualmente.

+1

Tuttavia, std :: vector farà riferimento a foo :: std :: vector solo se ce n'è uno. Altamente improbabile! Altrimenti troverà comunque :: std :: vector. –

+0

@Bo: No. Ad esempio, nell'esempio che presentiamo di seguito, se si rimuoveva la definizione di 'ns :: std :: vector', la dichiarazione di' v1' in 'ns :: f()' fallirebbe. –

+0

@James: OK, se effettivamente hai uno spazio dei nomi locale std senza un vettore, il compilatore ti dirà che è mancante. Questo non è un buon motivo per ** sempre ** usare :: di fronte a tutto. Se non si dispone di uno spazio dei nomi locale std, il normale std :: vector verrà comunque trovato, anche se ci si trova in un altro spazio dei nomi. –

3

Questo sempre prende il vector dalla libreria standard. std::vector potrebbe anche essere mycompany::std::vector se il codice in cui lo utilizzo è nello spazio dei nomi mycompany.

+1

Così i :: significa "l'inizio della struttura dello spazio dei nomi"? – Tom

+0

Sì. I commenti devono contenere almeno 15 caratteri. – Oswald

1

Iniziare con: significa reimpostare lo spazio dei nomi su spazio dei nomi globale. Potrebbe essere utile se stai cercando di combattere qualche ambiguità nel tuo codice.

17

Questo qualifica completamente il nome, in modo che solo il modello vector in viene utilizzato lo spazio dei nomi std nello spazio dei nomi globale. Fondamentalmente significa:

{global namespace}::std::vector<myclass> myvec; 

Non ci può essere una differenza quando si hanno le entità con lo stesso nome in diversi spazi dei nomi. Per un semplice esempio di quando questo potrebbe importa, prendere in considerazione:

#include <vector> 

namespace ns 
{ 
    namespace std 
    { 
     template <typename T> class vector { }; 
    } 

    void f() 
    { 
     std::vector<int> v1; // refers to our vector defined above 
     ::std::vector<int> v2; // refers to the vector in the Standard Library 
    }   
}; 

Dal momento che non è permesso di definire le proprie entità nel std spazio dei nomi, è garantito che ::std::vector sarà sempre fare riferimento al contenitore di libreria standard. std::vector potrebbe riferirsi a qualcos'altro. .

+0

Sembra che ci sarebbe anche un problema, anche se 'ns :: std' non dichiara un vettore. – UncleBens

+0

@UncleBens: un punto eccellente. Lo spazio dei nomi ':: ns :: std' sarebbe stato trovato e se non contenesse un'entità chiamata' vector', la ricerca dei nomi non avrebbe funzionato. –

+0

Buona risposta. Vorrei aggiungere che std non è una grande scelta per i normali casi d'uso. Di solito causerebbe confusione nella parte dell'utente finale. – Francesco

3

Prendendo un esempio -

int variable = 20 ; 

void foo(int variable) 
{ 

    ++variable;  // accessing function scope variable 
    ::variable = 40; // accessing global scope variable 
} 
Problemi correlati