在以下继承结构中,IFace
是Face
的私有(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/