我想了解所有允许我们使用 ::
运算符来访问类数据成员的情况。例如,我们可以使用 ::
来访问静态数据成员。其实,
#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:
An id-expression that denotes a non-static data member or non-static member function of a class can only be used:
- as part of a class member access (5.2.5) in which the object expression refers to the member’s class or a class derived from that class, or
- to form a pointer to member (5.3.1), or
- if that id-expression denotes a non-static data member and it appears in an unevaluated operand.
第 1 种情况是您试图更具体地说明您指的是什么成员。例如 a.A::b
。
情况 2 是获取成员(member)地址的地方。例如 &A::b
。
情况 3 是未评估的地方。例如 sizeof(A::b)
。
您示例中的 A::b
不是这些,因此它是非法的。
关于c++ - 了解非静态类成员访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28778671/