为什么初始化静态变量时私有成员可见?

问题描述 投票:0回答:1

编译:

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 的查找?)

c++ class static private sizeof
1个回答
4
投票

在静态数据成员的非内联定义中允许访问

private
成员,因为定义的 initializer 部分(即
=
的 RHS)在类,根据标准(“注释 1”,见下文):

11.4.9.3 静态数据成员       [class.static.data]



3   类定义中非内联静态数据成员的声明不是定义,并且可能是除 cv void 之外的不完整类型。
[注1:静态数据成员定义中的初始值设定项位于其类的范围内([basic.scope.class])。 — 尾注]


请注意,参考您的最后(更新)段落,因为初始化程序位于类作用域中,所以非限定/非作用域变量(例如您的情况下的

m

f()
)将默认引用类成员(如果存在的话);因此,代码中的 
f()
 调用完全等同于 
Node::f()

© www.soinside.com 2019 - 2024. All rights reserved.