我不明白这个结果

I don't understand this result

本文关键字:结果 明白      更新时间:2023-10-16

此代码不在clang 中编译

#include <iostream>
namespace M {
    class B {
        public:static const int i = 1000;
    };
}
namespace N {
    class Y /*: public M::B*/ {
        class X {
            int a[i];
            static const int i = 1;
        public:
            X() { for(int j = 0; j < i; ++j ) a[j] = 1; }
            static int Get() { return i; }
        };
        public:
        int Get() { return X::Get(); }
    };
}

int main()
{
    N::Y y;
    std::cout << y.Get() << 'n';
}

但如果我注释掉/*: public M::B*/,它确实会,打印1。但是,如果我将语句static const int i = 1;放在int a[i];之前,它会在两个版本的代码上编译,打印1。

非常感谢《标准报》的报价。

在带有注释基类的原始代码中,您试图使用尚未定义的名称i

   class X {
        int a[i]; // here i is undefined
        static const int i = 1;

如果你要交换的两个定义

   class X {
        static const int i = 1;
        int a[i];

那么代码将被成功编译,因为我在数组定义中使用的是以前定义的。。

当基类被取消注释时,那么在这个定义中

        int a[i];

i是B类的静态数据成员,即定义为的数组

        int a[1000];

之后,您定义了类X的静态数据成员i,它将类Y的基类B的静态数据元素隐藏在类X中。