2015-02-25 4 views
7

Ho letto che quando sei swap cose Ing in C++, si dovrebbe sempre using std::swap;, quindi chiamare swap qualificato, in modo che seleziona automaticamente la std:: quelli per std:: e incorporate tipi, la vostra abitudine uno per i tipi personalizzati, e su modelli std:: uno per tutto il resto.Va bene mettere "using std :: swap;" in un colpo di testa?

Quindi, posso semplicemente inserire using std::swap; nell'intestazione che include ogni file e non doversi preoccupare di ciò?

Comprendo che evitare using in un'intestazione è una pratica comune. Tuttavia, c'è un problema in questo caso particolare?

+0

possibile duplicato di [utilizzando la dichiarazione nei file di intestazione] (http://stackoverflow.com/questions/22201937/using-declaration-in-header-files) – aruisdante

+4

@aruisdante No, non lo è. OP sta chiedendo un particolare utilizzo. – Pradhan

+0

@Pradhan un uso particolare non rende più inquinante lo spazio dei nomi globale con 'using', credo. – aruisdante

risposta

7

La guida per lo scambio è using std::swapnella dimensione più locale possibile. Per certo, uno in un file di intestazione che è ampiamente incluso non soddisfa questo requisito. È ancora inquina lo spazio dei nomi globale in modi imprevisti (qualcuno che non si aspetta std::swap verrà importato nello spazio dei nomi globale) e dovrebbe essere evitato come using namespace.

+0

Quale comportamento inaspettato posso ottenere? – Dan

0

Il problema principale qui è che si presume che le persone non abbiano scritto i propri swap s che si tratti di corrispondenze migliori che fanno cose sottilmente o completamente diverse alla semantica di std::swap e amici correlati. Per un semplice esempio, prendere in considerazione

void swap(int* a, int* b); 

in cui vengono scambiati i contenuti dei puntatori. Ora prova a scambiare un paio di int*. Potresti pensare che i puntatori siano scambiati, ma invece, sorpresa! sono i contenuti che vengono scambiati.

In realtà, la guida per swap è la stessa di qualsiasi altra: solo using con l'ambito più locale possibile e non prima e sicuramente non in un'intestazione.

+0

Se qualcuno ha scritto 'void swap (int * a, int * b);' e la tua funzione ha fatto 'usando std :: swap; swap (x, y); 'su due puntatori a int, allora si otterrebbe lo stesso problema (trova la corrispondenza migliore invece di usare' std :: swap'). Quindi penso che il problema qui sia che la funzione di scambio fasullo non funziona con tutto. –

+0

@MattMcNabb No, la ricerca non qualificata si interrompe non appena il nome viene trovato nell'ambito locale; non ritirerai lo scambio fittizio dichiarato all'esterno. E non c'è nemmeno ADL. –