一个关于c++ 17嵌套类作为个部类的私有成员部份的问题

书上说是,嵌套类作为私有,在类的外部将不能访问,测试中使用书中相同的方式使用为auto推断,为什么在qt中可行呢:

#include <QCoreApplication>
#include<iostream>
using namespace std;
class a
{
private:
    class b
    {
    private:
        int x{22};
        friend class a;
        explicit b(int y):x{y}{}
    public:
        void getbx(){cout<<"b.x is: "<<x<<endl;}
        int z{33};

    };
public:
    b creatb(){return  b(66);}
    class c
    {
    public:
        int x{55};
    };
};

int main(int argc, char *argv[])
{
    QCoreApplication ax(argc, argv);
a obja;
obja.creatb().getbx();
//a::b objb; 使用私有成员错误
auto objb=obja.creatb();//这样为什么可行
cout<<objb.z<<endl;
a::c objc;

    return ax.exec();
}

问题中有个字打错了,应该是:一个关于c++ 17嵌套类作为外部类的私有成员部份的问题

#迷惑
感觉是各个编译器的实现不同


嵌套类声明服从成员访问说明符,从外围类的作用域之外不能指名私有的成员类,尽管可以操作该类的对象:

class enclose
{
    struct nested // 私有成员
    {
        void g() {}
    };
public:
    static nested f() { return nested{}; }
};
 
int main()
{
    //enclose::nested n1 = e.f(); // 错误:'nested' 是私有的
 
    enclose::f().g();       // OK:没有指名 'nested'
    auto n2 = enclose::f(); // OK:没有指名 'nested'
    n2.g();
}

这是c++的规定
https://zh.cppreference.com/w/cpp/language/nested_types