我想了解允许我们使用::
运算符来获取访问类数据成员的所有情况。例如,我们可以使用::
来访问静态数据成员。实际上,
#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(); }
我正在寻找涵盖我们可以使用::
运算符的所有情况的规则。 Strandard的哪一章告诉我们,我们不应该使用::
来访问这样的非静态数据成员
#include <iostream>
struct A
{
int b = 3;
};
int main() { std::cout << A::b << std:endl; } //error
答案 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
不是这些,所以这是非法的。