在C ++中,请考虑语法规则:
member-access-expression
:LHS
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。
答案 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}}。
这没有什么魔力,尽管通常在其他回答者演示的场景之外看到该构造,因为在此示例中它是多余的。