在以下继承结构中,IFaceFace的私有(private)基类:

class IFace{};

class Face : /*private*/ IFace{};

虽然从原始Face*IFace*指针的转换当然会失败,但是shared_ptr<Face>仍可以转换为shared_ptr<IFace>
shared_ptr<Face> s_face = make_shared<Face>();
shared_ptr<IFace> s_iface = s_face; //works

Face* p_face = new Face();
IFace* p_iface = p_face; //compiler complains (righteously)
                         //about the base class being inaccessible
shared_ptr在这里播放什么魔术?

该行为是否已包含在标准中,还是特定于我的实现(MSVC12)?

新创建的s_iface是否与s_face共享其引用计数?

最佳答案

如果指针不是隐式可转换的,则该标准要求对转换构造函数进行SFINAE处理(标准名称为“不得参与重载解析”)。这看起来像MSVC的std::is_convertible实现中的错误:

#include <type_traits>
class IFace {};

class Face : /*private*/ IFace{};

int main() {
    static_assert(std::is_convertible<Face *, IFace *>::value, "Face * is not convertible to IFace *");
    static_assert(!std::is_convertible<Face *, IFace *>::value, "Face * is convertible to IFace *");
}

使用MSVC12给我error C2338: Face * is convertible to IFace *

clang和g++都在第一个static_assert正确失败并报告Face * is not convertible to IFace *

查看MSVC的<type_traits> header ,is_convertible是使用内置的编译器实现的,因此归结为编译器错误。

关于c++ - shared_ptr如何转换为私有(private)基类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25100277/

10-12 21:22