了解非静态类成员访问

时间:2015-02-28 05:57:46

标签: c++ class

我想了解允许我们使用::运算符来获取访问类数据成员的所有情况。例如,我们可以使用::来访问静态数据成员。实际上,

#include <iostream>

struct A
{
    static const int b = 3;
};

int main() { std::cout << A::b << std::endl; }

另外,我们可以使用该表达式来访问非静态数据成员的brace-or-equal initializer内的非静态数据成员。

#include <iostream>

struct A
{
    int b = 3;
    void foo()
    {
        std::cout << A::b << std::endl;
    }
};

int main() { A().foo(); }

DEMO

我正在寻找涵盖我们可以使用::运算符的所有情况的规则。 Strandard的哪一章告诉我们,我们不应该使用::来访问这样的非静态数据成员

#include <iostream>

struct A
{
    int b = 3;
};

int main() { std::cout << A::b << std:endl; } //error

1 个答案:

答案 0 :(得分:1)

5.1.1.13在C ++ 14标准中:

  

表示非静态数据成员或非静态数据的id表达式   只能使用类的成员函数:

     
      
  • 作为类成员访问(5.2.5)的一部分,其中对象表达式引用成员的类或派生自该类的类   上课,或
  •   
  • 形成指向成员(5.3.1)或
  • 的指针   
  • 如果该id-expression表示非静态数据成员,并且它出现在未评估的操作数中。
  •   

案例1是您尝试更具体地了解您的意思是什么成员的地方。例如a.A::b

案例2是您获取会员地址的地方。例如&A::b

案例3是未评估的地方。例如sizeof(A::b)

你的例子中的A::b不是这些,所以这是非法的。