我在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:没有意识到这是重复的,当我在寻找答案时找不到任何东西。感谢大家的回复,现在有道理。