在Type :: var的情况下,范围解析运算符返回什么?

Man*_*ork 3 c++ scope operators member c++11

请考虑以下示例:

class A { int x; };
Run Code Online (Sandbox Code Playgroud)

现在是什么A::x

  • 它不能是左值,因为它不引用存储位置.
  • 它不能是一种类型,因为类型会是decltype(A::x).

T.C*_*.C. 11

事实上,这是一个左值.[expr.prim.id.qual]/2:

一个嵌套名称说明符,表示一个类[...]后跟该类([class.mem])或其基类之一的成员名称,是一个限定ID [...] .结果是成员.结果的类型是成员的类型.如果成员是静态成员函数或数据成员,则结果是左值,否则为prvalue.

虽然它在类成员访问表达式之外的用法受到[expr.prim.id]/2的严格限制,但它可以特别用于未评估的操作数,其左值可以显示:

struct A {
    int x;
};

void f(int &);

using p = decltype(&(A::x)); // p is int*; the parens prevents forming a pointer-to-member
using q = decltype(f(A::x)); // q is void
Run Code Online (Sandbox Code Playgroud)


Bat*_*eba 6

A::x仅仅是一种不太模糊的引用成员的方式,x如果本地上下文影响该成员,则可能是必要的:


例1:

儿童班也有会员x.

struct B : public A
{
    int x;
    void foo()
    {
        int local_x = x;
        int parent_x = A::x;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你x protected在课堂上做的话会编译A(目前是private).


例2:

你甚至可以在一个成员使用该函数Ax作为参数:

class A {
    int x;
    void foo(int x)
    {
        int parameter_x = x;
        int member_x = A::x;
    }
};
Run Code Online (Sandbox Code Playgroud)