¡Buena pregunta! Aprendí algo nuevo investigando y experimentando en él.
Tiene usted razón en su comentario, ::S(); //Is ::S a nested name specifier <-- Yes, Indeed!
Se podría llegar a apreciar que cuando se inicia la creación de espacios de nombres. Las variables pueden tener los mismos nombres en todos los espacios de nombres y el operador ::
es lo que los distingue. Los espacios de nombres son como clases en un sentido, otra capa de abstracción. No quisiera aburrirte con espacios de nombres. El usuario no puede apreciar el nombre especificador anidada en este ejemplo ... considere esto:
#include <iostream>
using namespace std;
int count(0); // Used for iteration
class outer {
public:
static int count; // counts the number of outer classes
class inner {
public:
static int count; // counts the number of inner classes
};
};
int outer::count(42); // assume there are 42 outer classes
int outer::inner::count(32768); // assume there are 2^15 inner classes
// getting the hang of it?
int main() {
// how do we access these numbers?
//
// using "count = ?" is quite ambiguous since we don't explicitly know which
// count we are referring to.
//
// Nested name specifiers help us out here
cout << ::count << endl; // The iterator value
cout << outer::count << endl; // the number of outer classes instantiated
cout << outer::inner::count << endl; // the number of inner classes instantiated
return 0;
}
cuenta que he utilizado ::count
donde podría haber utilizado simplemente count
. ::count
se refiere al espacio de nombre global.
Así, en su caso, ya que S() está en el espacio de nombres global (es decir, se ha declarado en el mismo archivo o un archivo incluido o cualquier pieza de código en el que no está envuelto por namespace <name_of_namespace> { }
, podría utilizar new struct ::S
o new struct S
; el que sea así lo prefiere.
acabo de aprender esto como tenía curiosidad de responder a esta pregunta por lo que si usted tiene una respuesta más específica y aprendido, por favor :) Compartir
Cuanto más pienso en ello, cuanto más pienso en este no es una muy buena respuesta. No sé cómo explicarlo en términos simples, pero aún así ser completamente correcto ... –
Poco Q: 'A :: B' -> puedo decir que' A' es ** constructo calificado ** y al mismo tiempo 'A ::' es un especificador de nombre anidado? –