是否存在上下文可以表达`a.b :: c`吗?

时间:2019-05-22 09:38:45

标签: c++

在C ++中,请考虑语法规则:

member-access-expressionLHS member-access-operator RHS
(op是.

LHS =不合格的id-expression,例如引用实例变量。
RHS =合格的id-expression(带有至少一个嵌套标识符)

示例:a.b::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;
  ^

demo

这倾向于向我暗示,在会员访问权限的右侧,没有任何法律可以证明合格ID。

3 个答案:

答案 0 :(得分:21)

一个非常简单的示例是,如果您要调用父类的成员函数:

struct A {
    void f();
};

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

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

答案 1 :(得分:9)

一个用例是通过使用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

答案 2 :(得分:5)

这是一个简单的例子:

struct A {
    void f() {}
};

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

A::f()f成员的函数A的名称的限定版本。您可以在成员访问权限中使用它,就像“短”(或 unqualified )名称一样。

实际上,有人可能会争辩说,每次您写a.f()时,这都是a.A::f()快捷方式(其中A::部分是从{ {1}}。

这没有什么魔力,尽管通常在其他回答者演示的场景之外看到该构造,因为在此示例中它是多余的。