Saltar al contenido

¿Cuál es el significado de dos puntos dobles antepuestos “::”?

Revisamos completamente cada secciones en nuestro sitio web con el objetivo de enseñarte siempre información con la mayor veracidad y actual.

Solución:

Esto asegura que la resolución ocurra desde el espacio de nombres global, en lugar de comenzar en el espacio de nombres en el que se encuentra actualmente. Por ejemplo, si tuviera dos clases diferentes llamadas Configuration como tal:

class Configuration; // class 1, in global namespace
namespace MyApp

    class Configuration; // class 2, different from class 1
    function blah()
    
        // resolves to MyApp::Configuration, class 2
        Configuration::doStuff(...) 
        // resolves to top-level Configuration, class 1
        ::Configuration::doStuff(...)
    

Básicamente, le permite viajar hasta el espacio de nombres global, ya que su nombre puede verse afectado por una nueva definición dentro de otro espacio de nombres, en este caso MyApp.

los :: operador se llama operador de resolución de alcance y hace precisamente eso, resuelve el alcance. Entonces, al anteponer un nombre de tipo con this, le dice a su compilador que busque el tipo en el espacio de nombres global.

Ejemplo:

int count = 0;

int main(void) 
  int count = 0;
  ::count = 1;  // set global count to 1
  count = 2;    // set local count to 2
  return 0;

Muchas respuestas razonables ya. Voy a contribuir con una analogía que puede ayudar a algunos lectores. :: funciona de forma muy parecida al separador de directorios del sistema de archivos ‘/‘, al buscar en su ruta un programa que le gustaría ejecutar. Considerar:

/path/to/executable

Esto es muy explícito: solo un ejecutable en esa ubicación exacta en el árbol del sistema de archivos puede coincidir con esta especificación, independientemente de la RUTA en vigor. Similar…

::std::cout

…es igualmente explícito en el “árbol” del espacio de nombres de C++.

En contraste con tales rutas absolutas, puede configurar buenos shells UNIX (por ejemplo, zsh) para resolver relativo rutas bajo su directorio actual o cualquier elemento en su PATH variable de entorno, por lo que si PATH=/usr/bin:/usr/local/biny estabas “en” /tmpluego…

X11/xterm

… felizmente correría /tmp/X11/xterm si se encuentra, de lo contrario /usr/bin/X11/xtermdemás /usr/local/bin/X11/xterm. Del mismo modo, supongamos que estaba en un espacio de nombres llamado Xy tenía un “using namespace Y“En efecto, entonces…

std::cout

…podría encontrarse en cualquiera de ::X::std::cout, ::std::cout, ::Y::std::cout, y posiblemente en otros lugares debido a la búsqueda dependiente de argumentos (ADL, también conocida como búsqueda de Koenig). Entonces, solo ::std::cout es realmente explícito acerca de exactamente a qué objeto te refieres, pero afortunadamente nadie en su sano juicio crearía su propia clase/estructura o espacio de nombres llamado “std“, ni nada llamado”cout“, por lo que en la práctica utilizando sólo std::cout está bien.

Diferencias notables:

1) las conchas tienden a usar la primera coincidencia usando el orden en PATHmientras que C++ da un error de compilación cuando ha sido ambiguo.

2) En C++, los nombres sin ningún ámbito principal pueden coincidir en el espacio de nombres actual, mientras que la mayoría de los shells de UNIX solo hacen eso si coloca . en el PATH.

3) C++ siempre busca en el espacio de nombres global (como tener / implícitamente tu PATH).

Discusión general sobre espacios de nombres y claridad de símbolos

Usando absoluto ::abc::def::... Las “rutas” a veces pueden ser útiles para aislarlo de cualquier otro espacio de nombres que esté usando, parte del contenido pero que realmente no tiene control sobre él, o incluso otras bibliotecas que también usa el código de cliente de su biblioteca. Por otro lado, también lo vincula más estrechamente con la ubicación “absoluta” existente del símbolo, y pierde las ventajas de la coincidencia implícita en los espacios de nombres: menos acoplamiento, movilidad más fácil del código entre espacios de nombres y código fuente más conciso y legible. .

Como con muchas cosas, es un acto de equilibrio. El estándar C++ pone muchos identificadores bajo std:: que son menos “únicos” que coutque los programadores podrían usar para algo completamente diferente en su código (por ejemplo, merge, includes, fill, generate, exchange, queue, toupper, max). Dos bibliotecas no estándar no relacionadas tienen una probabilidad mucho mayor de usar los mismos identificadores, ya que los autores generalmente no son conscientes entre sí. Y las bibliotecas, incluida la biblioteca estándar de C++, cambian sus símbolos con el tiempo. Todo esto crea potencialmente ambigüedad cuando se vuelve a compilar el código antiguo, particularmente cuando ha habido un uso intensivo de using namespaces: lo peor que puedes hacer en este espacio es permitir using namespaces en los encabezados para escapar de los ámbitos de los encabezados, de modo que una cantidad arbitrariamente grande de código de cliente directo e indirecto no puede tomar sus propias decisiones sobre qué espacios de nombres usar y cómo administrar las ambigüedades.

Entonces, un líder :: es una herramienta en la caja de herramientas del programador de C++ para desambiguar activamente un conflicto conocido y/o eliminar la posibilidad de ambigüedad futura….

Ten en cuenta comunicar este artículo si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *