私有嵌套类c ++的实例

Dmi*_*try 16 c++ visual-c++ c++11

我有以下代码

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"
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我有A类和私有嵌套类B.不使用auto我不能在A之外创建A :: B的实例,但是我可以使用auto.有人可以解释这里有什么问题吗?我使用VC++ 12.0,13.0,14.0(总是相同的行为)

Dav*_*eas 6

该类型B只能A与朋友访问A,这意味着其他代码无法引用它.另一方面,模板类型推导甚至适用于私有类型,如果您想在代码中使用任何形式的模板中的私有类型,则需要使用它A.

auto功能基于模板类型推导并遵循相同的规则,允许呼叫auto b2 = a.g();.