Есть ли контекст, в котором выражение 'ab :: c' имеет смысл?

В 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;
  ^

(демо)

Это намекает мне на то, что не может быть никакого юридического случая квалифицированного идентификатора на праве доступа участника.

Ответы

Ответ 1

Очень простой пример, если вы хотите вызвать функцию-член родительского класса:

struct A {
    void f();
};

struct B: A {
    void f();
};

B b;
b.A::f();

Ответ 2

Одним из вариантов использования является доступ к членам 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

Ответ 3

Вот тривиальный пример:

struct A {
    void f() {}
};

int main()
{
    A a;
    a.A::f();
}

A::f() является квалифицированной версией имени для функции f которая является членом A Вы можете использовать его в доступе к членам точно так же, как "короткое" (или неквалифицированное) имя.

На самом деле, можно утверждать, что каждый раз, когда вы пишете af(), это ярлык для aA::f() (часть A:: автоматически берется из decltype(a)).

В этом нет ничего волшебного, хотя необычно видеть конструкцию вне сценариев, продемонстрированных другими авторами, потому что в этом примере она избыточна.