C ++ 'using': ¿Debo usarlo o debo evitarlo?

13

Me doy cuenta de que hay una semántica sutilmente diferente para algunos de estos, debido a ADL.

Sin embargo, en general: ¿cuál debería preferir (si existe) y por qué?
(¿O depende de la situación (por ejemplo, encabezado en línea frente a implementación?)

También: ¿debería preferir ::std:: sobre 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 algo mas?

(Suponiendo que no tengo C ++ 11 y auto .)

    
pregunta Mehrdad 24.03.2012 - 08:29

3 respuestas

19

Evita usar using en los encabezados, porque eso rompe el propósito de los espacios de nombres.

Está bien usarlo en archivos de origen, pero en algunos casos lo evitaría (por ejemplo, using std ).

Sin embargo, si tienes espacios de nombres anidados, está bien:

namespace A {
namespace B {
namespace C {
class s;
} // C
} // B
namespace D{
using C::B::s;
} // D
} // A
    
respondido por el BЈовић 24.03.2012 - 08:58
6

Cuando coloque una declaración de uso en un archivo fuente, POR FAVOR, simplemente ingrese las cosas que necesita. Por ejemplo:

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

El problema aquí es que si lo haces

using namespace std;

usted introduce CADA ÚNICA cosa desde estándar en el espacio de nombres global. Lo que conduce a mensajes de error muy interesantes cuando accidentalmente usa un nombre en su código que coincide con uno que desconocía por completo en std. Si solo jala las cosas que desea, entonces no tendrá ese problema (o, más precisamente, el próximo programador que trabaje en su código no tendrá ese problema).

    
respondido por el Michael Kohne 03.08.2012 - 13:12
2

Como indica VJovic, no utilice using en un archivo de encabezado. using en un archivo de encabezado afecta a la unidad de compilación actual (el archivo .cpp) de manera que el archivo de origen no esté esperando.

using namespace también se debe evitar en un archivo fuente. Esto trae todos los símbolos al mismo alcance que el archivo fuente. Es más claro para sus lectores lo que está haciendo si usa símbolos específicos del espacio de nombres.

    
respondido por el Bill Door 24.03.2012 - 19:39

Lea otras preguntas en las etiquetas