[英]Understanding non-static class member access
我想了解所有情况,允许我们使用::
运算符来获取访问类数据成员。 例如,我们可以使用::
访问静态数据成员。 其实,
#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
C ++ 14标准中的5.1.1.13:
表示类的非静态数据成员或非静态成员函数的id表达式只能使用:
- 作为类成员访问(5.2.5)的一部分,其中对象表达式引用成员的类或从该类派生的类,或者
- 形成指向成员(5.3.1)的指针,或
- 如果该id表达式表示一个非静态数据成员,并且出现在未评估的操作数中。
在情况1中,您试图更具体地说明您的意思。 例如aA::b
。
情况2是您获取会员地址的地方。 例如&A::b
。
情况3是未评估的情况。 例如sizeof(A::b)
。
您的示例中的A::b
都不是,因此是非法的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.