我在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
到Base
的强制转换应该无法访问。任何人都可以解释为什么Visual Studio允许这样做?这是一个已知的问题吗?
以下一行不会因合理原因而编译。第一个和第二个用法之间的唯一区别是在第二个用法中创建了命名对象B
。
std::unique_ptr<Base> B(new Derived()); // Doesn't compile
它是否与this issue以某种方式相关仍未修复?
答案 0 :(得分: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