El compañero de trabajo afirma que esos dos puntos hacen someObject explícitamente global y por lo tanto evitar la confusión con un posible someObject local.
Sí - significa que la función puede ser, y solo debe ser, coincidente en el espacio de nombres global. Hace obvio que está tratando con un global, y evitaría la coincidencia accidental con algo más local (función local de beit, miembro de objeto, miembro de espacio de nombres, en un espacio de nombres que está usando, una coincidencia de búsqueda de Koenig, etc.).
Me gustaría pensar que usted no sería capaz de definir someObject localmente si ya estaba definido a nivel mundial?
Sería una mala idea hacerlo un error. Digamos que un equipo de programadores decide que quiere agregar una variable llamada "last_error" a su espacio de nombres: no deberían tener que preocuparse si las funciones existentes en el espacio de nombres usan el mismo nombre para una variable local. Si copia una función de un espacio de nombres o clase a otro, no debería tener que realizar sustituciones de identificadores propensas a errores en la implementación.
En cuanto a los beneficios de la ::, considere:
namespace X
{
void fn() {
rip(data, bytes); // MP3 rip this data
}
}
... entonces fn()
necesita ser movido rápidamente en espacio de nombres ... Y
namespace Y
{
void rip(const char* message, int exit_code); /* for fatal errors */
...
}
... contra copias ocasionales pegar en las entrañas de Y podría pasar fácilmente por alto que el registro no coincidirá con la misma función global que cuando fn estaba en el espacio de nombres X, pero, como se ilustra, la funcionalidad puede variar notablemente :-).
Puede pensar en cada espacio de nombre, clase/estructura y funciones formando un árbol, donde cada nivel debe tener una clave única (es decir, no hay clases del mismo nombre), pero las decendencias siempre son independientes entre sí y su antepasados. El aumento de la libertad para variar de forma independiente es esencial para permitir que muchas personas trabajen simultáneamente en un gran problema.
Podría arrojar alguna luz sobre lo que esos dos puntos significan y si son necesarios ?
En este uso específico, :: :: probablemente no sea estrictamente necesario. Agrega un poco de protección, pero hace que sea más difícil mover la variable a un alcance más local más tarde, aunque eso no es tan importante porque el compilador le informará sobre los lugares que continúan refiriéndose a :: x después de mover x.
Siempre destacaría los vars globals. Incluso si los vars locales con el mismo nombre fueron prohibidos. B/c globales son ** Evil ** –
El uso de '::' no está limitado a variables globales; se refiere a algo global. Por lo tanto, si tiene una clase legacy 'string', es recomendable referirse a ella como' :: string' y así evitar confusiones con 'std :: string'. – MSalters
@MSalters: b.t.w. ¿Qué pasa si escribo 'using namespace std' y luego' :: string str'? ¿Cuál será el tipo de 'str'? –