我能够将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));
您能否请任何人说出原因?
答案 0 :(得分:0)
首先,reinterpret_cast
会做什么?
- 将任何指针类型转换为任何其他指针类型,即使是不相关的类
- 到整数类型的指针或从整数类型的指针
请注意,此处完成的所有操作都涉及在指针类型之间,之间或从指针类型进行转换。因此,请注意reinterpret_cast<vector<Foo*>>(vf)
无效,因为它将vector<void*>
强制转换为vector<Foo*>
。尽管这些都是{<1>}包含指针,但vector
和vf
本身都不是指针。
解决了这个问题,我们来讨论vector<Foo*>
,这也是 ,如果由于Type Aliasing上的规则而被取消引用,也会导致不确定的行为。
假设reinterpret_cast<vector<Foo*>*>(&vf)
的输入是DynamicType且输出是AliasedType,则reinterpret_cast
仅在以下情况下有效:
- AliasedType和DynamicType相似
- AliasedType是DynamicType的(可能是经过简历验证的)带符号或无符号的变体
- AliasedType为
reinterpret_cast
,std::byte
或char
:这允许将任何对象的对象表示形式检查为字节数组非正式地,如果忽略顶级cv资格,则两种类型相似:
- 它们是同一类型
- 它们都是指针,并且指向的类型相似
- 它们都是指向同一类成员的指针,并且指向的成员的类型相似
- 它们都是相同大小的数组,或者都是边界未知的数组,并且数组元素类型相似
由于对于unsigned char
和vector<void*>*
而言,都不正确,因此取消引用vector<Foo*>*
的输出是未定义的行为。
现在,我们已经讨论了为什么两者都不受欢迎;让我建议您改为:reinterpret_cast
可以这样做:void reportFooVector(void** pvf, const size_t count)
在reportFooVector(data(vf), size(vf))
内部,您需要将单个元素转换为reportFooVector
才能对它们进行操作。