编译:
class Node{
int m = 0;
static unsigned f(){
return 1;
}
public:
static unsigned a;
static unsigned b;
};
unsigned Node::a = sizeof(m); // <= !!!
unsigned Node::b = f(); // <= !!!
int main(){
}
为什么?我知道
sizeof
不起作用,但 m
和 f()
不是私有的吗?
这绝对不是一个错误,因为代码可以在 GCC、MSVC、Clang 和 Intel C++ 上编译。
更新:另外,请注意,它只是
sizeof(m)
而不是 sizeof(Node::m)
;与 f()
相同,而不是 Node::f()
。 (Koenig 的查找?)
在静态数据成员的非内联定义中允许访问
private
成员,因为定义的 initializer 部分(即 =
的 RHS)在类,根据标准(“注释 1”,见下文):
11.4.9.3 静态数据成员 [class.static.data]…
3 类定义中非内联静态数据成员的声明不是定义,并且可能是除 cv void 之外的不完整类型。
[注1:静态数据成员定义中的初始值设定项位于其类的范围内([basic.scope.class])。 — 尾注] …
m
和
f()
)将默认引用类成员(如果存在的话);因此,代码中的
f()
调用完全等同于
Node::f()
。