En C++, ¿cuál es el propósito del operador de resolución de alcance cuando se utiliza sin ámbito? Por ejemplo:operador de resolución de alcance sin ámbito
::foo();
En C++, ¿cuál es el propósito del operador de resolución de alcance cuando se utiliza sin ámbito? Por ejemplo:operador de resolución de alcance sin ámbito
::foo();
Significa alcance global. Es posible que necesite utilizar este operador cuando tenga funciones o variables en conflicto en el mismo ámbito y necesite utilizar una función global. Es posible que tenga algo como:
void bar(); // this is a global function
class foo {
void some_func() { ::bar(); } // this function is calling the global bar() and not the class version
void bar(); // this is a class member
};
Si necesita llamar a la función global bar() desde dentro de una función miembro de la clase, se debe utilizar :: bar() para llegar a la versión global de la función.
refiriéndose al ámbito global
-1: ¡Exceedingly vago! –
Cuando ya tiene una función llamada foo() en el ámbito local, sino que necesita para acceder a la una en el ámbito global.
Mi C++ está oxidado pero creo que si tiene una función declarada en el ámbito local, como foo() y una en alcance global, foo() se refiere a la local. :: foo() se referirá a la global.
También debe tener en cuenta que la resolución del nombre ocurre antes de la resolución de sobrecarga. Entonces, si hay algo con el mismo nombre en su alcance actual, dejará de buscar otros nombres e intentará usarlos.
void bar() {};
class foo {
void bar(int) {};
void foobar() { bar(); } // won't compile needs ::bar()
void foobar(int i) { bar(i); } // ok
}
Un nombre que comienza con la scope resolution operator (::
) se busca en el espacio de nombres global. Podemos ver esto mirando la sección draft C++ standard3.4.3
nombre calificado de búsqueda el párrafo 4 que dice (el énfasis es mío ):
Un nombre prefijado por el operador unario alcance :: (5.1) es buscado en el alcance global, en la unidad de traducción donde se usa. El nombre debe declararse en el ámbito del espacio de nombres global o debe ser un nombre cuya declaración sea visible en el ámbito global debido a una directiva using (3.4.3.2). El uso de :: permite hacer referencia a un nombre global incluso si su identificador ha sido ocultado (3.3.10).
Como los estados estándar Esto nos permite utilizar nombres del espacio de nombres global that would otherwise be hidden, el ejemplo del documento vinculado es el siguiente:
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;
}
La redacción es muy similar a volver a N1804 que es el primer borrador de estándar disponible.
¿Por qué no compila? –
[Parece que compila] (http://ideone.com/tUVXrb) –
Es necesario agregar aquí que lo que define en un espacio de nombre anónimo también se puede llamar utilizando el operador de ámbito unario: – DrumM