c – 是否可以指向可转换的不同模板类型?

我有一个模板类,它将一些信息与类型捆绑在一起:

template <typename T>
class X
{
  int data[10]; // doesn't matter what's here really
  T t;
public:
  // also not terribly relevant
};

然后我们假设我们有一个Base类和Derived类:

class Base {};

class Derived : public Base {};

我希望能够做这样的事情(但我认为我不能):

void f(shared_ptr<X<Base> > b);

shared_ptr<X<Derived> > d(new X<Derived>);

f(d);

有没有办法可以指向X< T>可转换为X< Y>的指针.如果T *可以转换为Y *?

最佳答案 将问题改为更一般:如果不相关的类型本身是可转换的,是否可以转换来自不相关类型的指针?答案不是.不同的模板实例定义了不同的不相关类型.

您可以隐式转换(请参阅下面的注释)指向派生对象的指针到基础对象的指针(由于访问或歧义而适用某些限制),或者您可以从基指针到派生指针进行显式转换(同样使用一些限制).您也可以来回转换为void *,但转换为不相关的类型最终会导致未定义的行为.

指针无法从不相关的类型转换,这有明显的原因.第一个是将一个指针类型转换为另一个指针类型将不会转换指向的内存.也就是说,您可以将int转换为double,但将指向int的指针转换为指向double的指针会使编译器认为指向的地址有8个字节的内存,而实际上只有4个字节存在(假设32位或64位架构,32位整数和64位双精度).取消引用指针肯定会结束.

标准说明:

该标准的4.10节处理指针转换,第一段处理空指针转换,第二段处理空指针转换.第三段声明只要B是D的基类,就可以将指向类型D的指针转换为类型B的指针.在那里没有定义其他指针转换.在第5.4节中指定了显式转换,第7段处理指针转换,只在B是B的基数时,在几种情况下只添加从B *到D *的可能的显式转换.

点赞