将一种类型的向量重新解释为一种类型相同的另一种类型的向量

时间:2017-09-04 22:25:24

标签: c++ vector reinterpret-cast

我不确定here这个问题是否由于措辞错误而回答了这个问题,但是:

如果我有:

struct numpair
{
    some_type_with_a_size_of_2 a,b;
};

struct bignum
{
    some_type_with_a_size_of_4 a;
};

我可以将一个bignums矢量重新解释为numpairs的向量吗?如果没有,是否还有其他变通方法要求我制作新的矢量并重新解释每个元素?

编辑:在我正在使用的visual studio 2017窗口上,这两种类型的大小相同。

编辑:我现在已经了解了这个严格的别名规则。这应该是二进制数据,用不同的接口查看。抛开reinterpret_cast,我可以使用这些类型的向量联合吗?

2 个答案:

答案 0 :(得分:3)

struct A
{
    int x;
};

struct B
{
    int x;
};

你甚至无法重新解释这两种类型之间的强制转换。它会违反严格的别名规则。所以不,你不能做你想做的事。

  

§3.10左值和右值[basic.lval]

     

10如果程序试图访问对象的存储值   通过以下类型之一以外的glvalue   行为未定义: 54

     
      
  • 对象的动态类型,
  •   
  • 对象的动态类型的cv限定版本,
  •   
  • 与对象的动态类型相似的类型(如4.4中所定义)
  •   
  • 与对象的动态类型对应的有符号或无符号类型的类型
  •   
  • 与对象的动态类型的cv限定版本对应的有符号或无符号类型的类型,
  •   
  • 聚合或联合类型,包括其元素或非静态数据成员中的上述类型之一(包括,   递归地,子聚合的子元素或非静态数据成员   包含联盟),
  •   
  • 一种类型,它是对象动态类型的(可能是cv限定的)基类类型, - char或unsigned char类型。
  •   
     

54)此列表的目的是指定其中的那些情况   对象可能有也可能没有别名。

答案 1 :(得分:2)

$ cat omg.cpp && g++ omg.cpp && echo ========== && ./a.out
#include <iostream>

struct numpair {
    unsigned short a,b;
};

struct bignum {
    unsigned long a;
};

int main() {
    std::cout << sizeof(numpair) << " != " << sizeof(bignum) << std::endl;
}
==========
4 != 8

为什么你认为类型相同?