Хороший вопрос! Я узнал что-то новое, исследуя и экспериментируя на этом.
Вы правы в своем комментарии, ::S(); //Is ::S a nested name specifier <-- Yes, Indeed!
Вы оцените это, когда начнете создавать пространства имен. Переменные могут иметь одинаковые имена в пространствах имен, и оператор ::
- это то, что их отличает. Пространства имен похожи на классы в некотором смысле, еще один уровень абстракции. Я бы не хотел утомлять вас пространствами имен. Возможно, вы не оцените спецификатор вложенного имени в этом примере ... рассмотрите этот:
#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;
}
Обратите внимание, что я использовал ::count
, где я мог просто использовать count
. ::count
относится к глобальному пространству имен.
Так что в вашем случае, так как S () находится в глобальном пространстве имен (то есть он объявлен в том же файле или включенном файле или любом фрагменте кода, где он не заключен в namespace <name_of_namespace> { }
, вы можете использовать new struct ::S
или new struct S
; в зависимости от того, что вы предпочитаете.
Я только что узнал об этом, поскольку мне было любопытно ответить на этот вопрос, поэтому, если у вас есть более конкретный и выученный ответ, пожалуйста, поделитесь :)