为什么Visual Studio编译器允许在此示例中违反私有继承?

Vik*_*tor 8 c++ encapsulation unique-ptr visual-studio private-inheritance

std::unique_ptr在Visual Studio 2013和2017中发现了非常奇怪的行为.让我们考虑一个例子:

class Base 
{
public:
    virtual ~Base() = default;
    virtual void Foo() = 0;
};

class Derived : private Base 
{
public:
    void Foo() override
    {
        std::cout << "Foo";
    }
};

void Foo(std::unique_ptr<Base> a)
{
    a->Foo();
}

Foo(std::unique_ptr<Base>(new Derived())); // Compiles
Run Code Online (Sandbox Code Playgroud)

请注意,继承是私有的.此示例仅在Visual Studio上编译.而且,虚函数调用有效,因为它是公共继承.因此,我们有封装侵犯,因为从演员DerivedBase应该无法访问.任何人都可以解释为什么Visual Studio允许这样做?这是一个已知的问题吗?

由于合理的原因,下面的行无法编译.第一个和第二个用法之间的唯一区别在于第二个,B创建了命名对象.

std::unique_ptr<Base> B(new Derived()); // Doesn't compile
Run Code Online (Sandbox Code Playgroud)

是否与此问题有关,仍然没有修复?

Swo*_*ish 1

cl此问题已在版本 19.15.26726(VS 2017 v15.9.0-pre.1.0)中修复:

Foo(std::unique_ptr<Base>(new Derived()));
Run Code Online (Sandbox Code Playgroud)

给出

error C2243: 'type cast': conversion from 'Derived *' to 'Base *' exists, but is inaccessible
Run Code Online (Sandbox Code Playgroud)