为什么auto关键字允许创建私有声明的内部类或内部结构的实例?

时间:2015-12-01 22:56:36

标签: c++ class c++11 struct inner-classes

我在C ++中发现了一些奇怪的东西,我不明白它为什么会发生。

我有一个带有私有结构定义的内部类,它看起来像这样:

#include <string>
class A {
private:
    class B {
    private:
        struct C {
            int lol;
            std::string ok;
        };
    public:
        B() {}
        C* makething();
    };
public:
    A() {}
    void dostuff();
};

C* makething();只返回一个新的结构C,如下所示:

A::B::C* A::B::makething()
{
    C* x = new C;
    return x;
} 

现在,如果void dostuff();的实现是这样的:

void A::dostuff()
{
    B x = B();
    B::C* thing = x.makething(); // compile error
    thing->lol = 42;
    thing->ok = "some words";
    std::cout << thing->lol << " " << thing->ok;
}

它给了我错误:C2248 'A::B::C': cannot access private struct declared in class 'A::B'这是预期的,因为struct C在B类中被声明为私有。

但是,如果我将行B::C* thing = x.makething();更改为auto thing = x.makething();,它将编译并且不再向我提供struct C为private的错误,然后我可以修改结构的值,就像我在makething()函数。

为什么会这样?为什么auto关键字允许我创建私有声明的结构或类的实例?

编辑:我使用Visual Studio Community 2015作为编译器。

编辑2:没有意识到这是重复的,当我在寻找答案时找不到任何东西。感谢大家的回复,现在有道理。

0 个答案:

没有答案