8

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

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

请注意,继承是私有的。此示例仅在 Visual Studio 上编译。此外,虚函数调用之所以有效,是因为它是公共继承。所以我们有封装违规,因为从Derivedto的转换Base应该是不可访问的。谁能解释为什么 Visual Studio 允许这样做?这是一个已知问题吗?

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

std::unique_ptr<Base> B(new Derived()); // Doesn't compile

它是否与这个仍未解决的问题有某种关系?

4

1 回答 1

1

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

Foo(std::unique_ptr<Base>(new Derived()));

error C2243: 'type cast': conversion from 'Derived *' to 'Base *' exists, but is inaccessible
于 2018-09-27T23:03:34.113 回答