Вы ошибаетесь по поводу второго комментария.В S::x
S
- это имя в спецификаторе вложенного имени.Стандарт ссылается на «спецификатор базы»:
namespace B { struct X { }; void X() }
struct A : B::X { }; // B::X is a base-specifier
Вы также не правы по этому поводу:
::S();
// вложенное имяспецификатор, игнорирует объявление структуры 'S'.
Этот код вызывает функцию не потому, что ::S
будет спецификатором вложенного имени (это не вложенное имя-specifier!), но поскольку имена функций скрывают имена классов или перечислений, если и функция, и класс / перечисление объявлены в одной и той же области видимости.
FWIW, следующий код будет одинаково действительным для строки 2main
p->S::f();
Важно то, что S
предшествует ::
, что заставляет поиск игнорировать функцию.То, что вы поставили ::
перед S
, не имеет никакого эффекта в вашем случае.