在下面的继承结构中,IFace是Face的私有基类
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 inaccessibleshared_ptr在这里玩什么魔术?
这种行为是否包括在标准中,还是特定于我的实现(MSVC12)?
新创建的s_iface是否与s_face共享其引用计数?
发布于 2014-08-02 23:47:16
该标准要求转换构造函数是SFINAE(如果指针不是隐式可转换的,标准是“不参与过载解析”)。这看起来像MSVC的std::is_convertible实现中的一个bug
#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是用内置的编译器实现的,所以它归结为编译器错误。
https://stackoverflow.com/questions/25100277
复制相似问题