Ответ 1
Очень простой пример, если вы хотите вызвать функцию-член родительского класса:
struct A {
void f();
};
struct B: A {
void f();
};
B b;
b.A::f();
В C++ рассмотрим правило грамматики:
member-access-expression
: member-access-operator
LHS
RHS
(оп .
)
а также LHS
= неквалифицированное id-expression
например, которое ссылается на переменную экземпляра. RHS
= квалифицированное id-expression
(хотя бы с одним вложенным идентификатором)
пример: ab::c
Если это когда-нибудь сможет пройти семантическую проверку, в какой ситуации это будет?
Следующий эксперимент:
struct B{};
struct A
{
B b;
};
int main()
{
A a;
a.b::c;
}
возвращается
'b' is not a class, namespace, or enumeration
a.b::c;
^
(демо)
Это намекает мне на то, что не может быть никакого юридического случая квалифицированного идентификатора на праве доступа участника.
Очень простой пример, если вы хотите вызвать функцию-член родительского класса:
struct A {
void f();
};
struct B: A {
void f();
};
B b;
b.A::f();
Одним из вариантов использования является доступ к членам enum
в некоторой struct A
с использованием экземпляра A
(вместо непосредственного использования перечисления через A::b::c
):
struct A {
enum class b { c }; // can be unscoped as well
};
A a;
a.b::c; // Access to enum value c - similarly, A::b::c would work
Вот тривиальный пример:
struct A {
void f() {}
};
int main()
{
A a;
a.A::f();
}
A::f()
является квалифицированной версией имени для функции f
которая является членом A
Вы можете использовать его в доступе к членам точно так же, как "короткое" (или неквалифицированное) имя.
На самом деле, можно утверждать, что каждый раз, когда вы пишете af()
, это ярлык для aA::f()
(часть A::
автоматически берется из decltype(a)
).
В этом нет ничего волшебного, хотя необычно видеть конструкцию вне сценариев, продемонстрированных другими авторами, потому что в этом примере она избыточна.