C++ 具有全局成员模糊性的静态数据成员定义

C++ 具有全局成员模糊性的静态数据成员定义,c++,C++,当定义类的静态成员时,x是一个全局变量,同时也是类中的静态变量时,可以看到如下的模糊性 ambiguity.cpp using namespace std; int z = 100; int x = 100; class WithStatic { static int x; static int y; static int a; public: void print() const { cout <<

当定义类的静态成员时,x是一个全局变量,同时也是类中的静态变量时,可以看到如下的模糊性

ambiguity.cpp
using namespace std;

int z = 100;

int x = 100;

class WithStatic {

    static int x;
    static int y;
    static int a;

    public:

        void print() const {
            cout << "WithStatic::x = " << x << endl;
            cout << "WithStatic::y = " << y << endl;
            cout << "WithStatic::a = " << a << endl;
        }
};

int WithStatic::x = 1;
int WithStatic::y = x + 1;
int WithStatic::a= z+1;

int main() {
    WithStatic ws;
    ws.print();
}
我在定义
y
时遇到问题。为什么不使用全局
x
<代码>带有static::x。 为什么y的输出不等于101,而不是2?

From 9.4静态成员[类别静态] 第3段:

静态成员可在其类别的范围内或从其类别派生的类别(第10条)的范围内直接引用;在本例中,静态成员的引用与使用限定id表达式的情况相同,限定id的嵌套名称说明符命名引用静态成员的类范围

从…起 9.4静态成员[类别静态] 第3段:

静态成员可在其类别的范围内或从其类别派生的类别(第10条)的范围内直接引用;在本例中,静态成员的引用与使用限定id表达式的情况相同,限定id的嵌套名称说明符命名引用静态成员的类范围


你怎么回事啊?如果我觉得不错的话。你的静态y应该是2,这就是你要输出的…@Developer我的问题是为什么y不等于101。我也希望是101。你有什么问题?如果我觉得不错的话。你的静态y应该是2,这就是你要输出的…@Developer我的问题是为什么y不等于101。我也希望是101。但这是如何解释歧义的呢?@Malik:是的,我也讨厌standardease。但问题的关键在于价格的意义(但是(标准中的)例子应该对那些不是标准专家的人有所帮助)。但是,从我可以读到这一点(我可能是错的):因为
Y::I
Y
的静态成员,因此当它被初始化时,我们从
Y
的范围内初始化它,并从那里进行名称查找。这意味着从该上下文中搜索
g()
,因此我们(按此顺序)检查
Y::g()
::g()
(注意,我们搜索是因为我们没有直接引用它)。但这是如何解释歧义的呢?@Malik:是的,我也讨厌standardease。但问题的关键在于价格的意义(但是(标准中的)例子应该对那些不是标准专家的人有所帮助)。但是,从我可以读到这一点(我可能是错的):因为
Y::I
Y
的静态成员,因此当它被初始化时,我们从
Y
的范围内初始化它,并从那里进行名称查找。这意味着从该上下文中搜索
g()
,因此我们(按此顺序)检查
Y::g()
::g()
(注意,我们搜索是因为我们没有直接引用它)。
WithStatic::x = 1

WithStatic::y = 2

WithStatic::a = 101
// Example:
int g();
struct X
{
    static int g();
};
struct Y : X
{
    static int i;
};
int Y::i = g(); // equivalent to Y::g();