我在 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 上编译。此外,虚函数调用之所以有效,是因为它是公共继承。所以我们有封装违规,因为从Derived
to的转换Base
应该是不可访问的。谁能解释为什么 Visual Studio 允许这样做?这是一个已知问题吗?
下面的行由于合理的原因无法编译。第一种用法和第二种用法之间的唯一区别在于第二种用法,B
即创建了命名对象。
std::unique_ptr<Base> B(new Derived()); // Doesn't compile
它是否与这个仍未解决的问题有某种关系?