C ++ 'using': dovrei usarlo o dovrei evitarlo?

13

Mi rendo conto che ci sono semantiche sottilmente diverse per alcune di queste, a causa dell'ADL.

In generale, però: quale preferire (se esiste) e perché?
(Oppure dipende dalla situazione (ad esempio intestazione in linea rispetto all'implementazione?)

Inoltre: dovrei preferire ::std:: oltre std:: ?

using namespace std;

pair<string::const_iterator, string::const_iterator> f(const string &s)
{
    return make_pair(s.begin(), s.end());
}

o

std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s)
{
    return std::make_pair(s.begin(), s.end());
}

o

using std::pair;
using std::string;

pair<string::const_iterator, string::const_iterator> f(const string &s)
{
    return make_pair(s.begin(), s.end());
}

o

std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s)
{
    using std::make_pair;
    return make_pair(s.begin(), s.end());
}

o

std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s)
{
    using namespace std;
    return make_pair(s.begin(), s.end());
}

o qualcos'altro?

(Questo presuppone che io non abbia C ++ 11 e auto .)

    
posta Mehrdad 24.03.2012 - 08:29
fonte

3 risposte

19

Evita di usare using nelle intestazioni, perché ciò spezza lo scopo degli spazi dei nomi.

Va bene usarlo nei file sorgente, ma lo eviterei comunque in alcuni casi (ad esempio using std ).

Tuttavia, se hai uno spazio dei nomi annidato, va bene:

namespace A {
namespace B {
namespace C {
class s;
} // C
} // B
namespace D{
using C::B::s;
} // D
} // A
    
risposta data 24.03.2012 - 08:58
fonte
6

Quando inserisci un'istruzione using in un file sorgente, PER FAVORE, tira semplicemente le cose che ti servono. Ad esempio:

using std::string;
using std::ostringstream;

Il problema qui è che se lo fai

using namespace std;

entri OGNI SINGOLA COSA da std nel namespace globale. Il che porta a messaggi di errore molto interessanti quando utilizzi accidentalmente un nome nel tuo codice che corrisponde a quello di cui eri completamente ignaro in std. Se solo inserisci le cose che vuoi, allora non avrai questo problema (o, più precisamente, il prossimo programmatore che lavora sul tuo codice non avrà questo problema).

    
risposta data 03.08.2012 - 13:12
fonte
2

Come indica VJovic, non utilizzare using in un file di intestazione. using in un file di intestazione influisce sull'unità di compilazione corrente (il file .cpp) in modi che il file di origine potrebbe non prevedere.

using namespace deve anche essere evitato in un file sorgente. Ciò porta ogni simbolo nello stesso ambito del file sorgente. È più chiaro per i tuoi lettori cosa stai facendo se usi simboli specifici dallo spazio dei nomi.

    
risposta data 24.03.2012 - 19:39
fonte

Leggi altre domande sui tag