C ++中的引用和指针类型转换

时间:2018-09-25 12:13:36

标签: c++ stl

我能够将vector<void*>的引用类型转换为vector<Foo*>的引用,而我无法类型化vector<void*> to vector<Foo*>。我收到错误C2440:'reinterpret_cast':为什么不能从'std :: vector <_Ty>'转换为'std :: vector <_Ty>'为什么?

而且我能够将void *类型转换为Foo *,而不会出现编译器错误。

void* g =&foo;
reportFooVector2(reinterpret_cast<Foo*>(g));

下面是我的整个代码。

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

struct Foo
{
  string s;
  int i;
};


void reportFooVector( vector <Foo*> * pvf )
{

}


void reportFooVector1( vector <Foo*> pvf )
{
}

void reportFooVector2( Foo *pvf )
{
}


int main()
{
    struct Foo foo = {"foo",  5};
    struct Foo goo = {"goo", 10};
    void* g =&foo;
    reportFooVector2(reinterpret_cast<Foo*>(g));
    vector <void *> vf;
    vf.push_back(&foo);
    vf.push_back(&goo);
    reportFooVector1( reinterpret_cast< vector < Foo * >  >(vf));
    reportFooVector( reinterpret_cast< vector < Foo * > * >(&vf));
}

在上述程序中,我得到编译器错误 C2440:'reinterpret_cast':调用时无法从'std :: vector <_Ty>'转换为'std :: vector <_Ty>' reportFooVector1( reinterpret_cast< vector < Foo * > >(vf));

您能否请任何人说出原因?

1 个答案:

答案 0 :(得分:0)

首先,reinterpret_cast会做什么?

  
      
  • 将任何指针类型转换为任何其他指针类型,即使是不相关的类
  •   
  • 到整数类型的指针或从整数类型的指针
  •   

请注意,此处完成的所有操作都涉及在指针类型之间,之间或从指针类型进行转换。因此,请注意reinterpret_cast<vector<Foo*>>(vf)无效,因为它将vector<void*>强制转换为vector<Foo*>。尽管这些都是{<1>}包含指针,但vectorvf本身都不是指针。

解决了这个问题,我们来讨论vector<Foo*>,这也是 ,如果由于Type Aliasing上的规则而被取消引用,也会导致不确定的行为。
假设reinterpret_cast<vector<Foo*>*>(&vf)的输入是DynamicType且输出是AliasedType,则reinterpret_cast仅在以下情况下有效:

  
      
  • AliasedType和DynamicType相似
  •   
  • AliasedType是DynamicType的(可能是经过简历验证的)带符号或无符号的变体
  •   
  • AliasedType为reinterpret_caststd::bytechar:这允许将任何对象的对象表示形式检查为字节数组
  •   
     

非正式地,如果忽略顶级cv资格,则两种类型相似:

     
      
  • 它们是同一类型
  •   
  • 它们都是指针,并且指向的类型相似
  •   
  • 它们都是指向同一类成员的指针,并且指向的成员的类型相似
  •   
  • 它们都是相同大小的数组,或者都是边界未知的数组,并且数组元素类型相似
  •   

由于对于unsigned charvector<void*>*而言,都不正确,因此取消引用vector<Foo*>*的输出是未定义的行为。


现在,我们已经讨论了为什么两者都不受欢迎;让我建议您改为:reinterpret_cast可以这样做:void reportFooVector(void** pvf, const size_t count)reportFooVector(data(vf), size(vf))内部,您需要将单个元素转换为reportFooVector才能对它们进行操作。