【发布时间】:2015-02-18 19:39:46
【问题描述】:
我有以下代码
class A
{
private:
class B
{
public:
void f()
{
printf("Test");
}
};
public:
B g()
{
return B();
}
};
int main()
{
A a;
A::B b; // Compilation error C2248
A::B b1 = a.g(); //Compilation error C2248
auto b2 = a.g(); // OK
a.g(); // OK
b2.f(); // OK. Output is "Test"
}
如您所见,我有 A 类和私有嵌套 B 类。 如果不使用 auto 我无法在 A 之外创建 A::B 的实例,但使用 auto 我可以。 有人可以解释这里有什么问题吗? 我使用 VC++ 12.0、13.0、14.0(总是相同的行为)
【问题讨论】:
-
当然,您无权访问类范围之外的私有成员。这就是他们的目的。
-
如果我没记错的话,访问控制实际上适用于names。当使用
auto时,类型不是命名的,而是推导的,因此可以访问。我对么?见stackoverflow.com/q/21736828/10077 -
顺便说一句,我使用 g++ 4.8.1 使用此代码得到了相同的结果。不仅仅是 MSVC++。
-
@milleniumbug:确实,我认为这个问题是重复的。
标签: c++ visual-c++ c++11