首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shared_ptr如何转换为私有基类?

shared_ptr如何转换为私有基类?
EN

Stack Overflow用户
提问于 2014-08-02 23:27:27
回答 1查看 234关注 0票数 2

在下面的继承结构中,IFaceFace的私有基类

代码语言:javascript
复制
class IFace{};

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

虽然从原始Face*IFace*指针的转换当然失败,但仍然可以将shared_ptr<Face>转换为shared_ptr<IFace>

代码语言:javascript
复制
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共享其引用计数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-02 23:47:16

该标准要求转换构造函数是SFINAE(如果指针不是隐式可转换的,标准是“不参与过载解析”)。这看起来像MSVC的std::is_convertible实现中的一个bug

代码语言:javascript
复制
#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 *");
}

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

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

看看MSVC的<type_traits>头,is_convertible是用内置的编译器实现的,所以它归结为编译器错误。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25100277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档