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

问题描述 投票: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()
相同(Koenigs 查找?)

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

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

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

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



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

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