2017-09-04 91 views
-1

我不知道如果这个问题here回答这个问题,由于怪异的措辞,但:reinterpret_cast的-ING一种类型的载体的另一种类型是相同类型的载体

如果我有:

struct numpair 
{ 
    some_type_with_a_size_of_2 a,b; 
}; 

struct bignum 
{ 
    some_type_with_a_size_of_4 a; 
}; 

我可以reinterpret_cast一个向量的数字向量numpairs?如果没有,是否有其他解决方法不需要我创建一个新的矢量,并通过重新解释每个元素来重新解析?

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

编辑:我现在已经了解到,如果这个严格的锯齿规则。这应该是二进制数据,用不同的接口查看。把reinterpret_cast放在一边,我可以使用这些类型的向量的联合吗?

+3

你绝对不能reinterpret_cast。在两个完全不相关的非平凡类型之间铸造......将不会结束。 –

+1

你甚至不能在单个'numpair'和'bignum'之间重新诠释播放。 – HolyBlackCat

+0

这很奇怪。我确信你可以。你不是这么说的,因为他们有不同的尺寸,对吧?我知道你不能这样做两个不同大小的班级。 – Evan

回答

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 

为什么你认为类型是相同的?

+1

当我运行此代码我得到: 4!= 4 按任意键继续。 。 。 你在什么操作系统上? – Evan

+1

@Evan你得到了“幸运”。这恰好在Windows上“工作”,因为这些类型碰巧具有相同的大小。但它仍然是非法的。 –

+0

@BaummitAugen 是的,出于某种原因,我认为长期保证是短的两倍。至少我没有很难学习它。 – Evan

3
struct A 
{ 
    int x; 
}; 

struct B 
{ 
    int x; 
}; 

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

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

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

  • 动态类型的对象,
  • 动态类型的对象的CV-合格版本,
  • 相似(如在4.4定义)的动态类型的对象的类型,
  • 被签名的一种类型,是有符号或对应的动态对象的类型无符号类型,
  • 一个类型或对应于该对象的动态类型的cv限定版本的无符号类型,其中包括上述类型之一的元素或非静态数据成员(包括, 递归,元素或非一个子集的静态数据成员或 包含联合),
  • 这是一种类型(可能是cv合格的)基类类型的对象的动态类型, - 一个字符或无符号字符类型。

54)这个列表的目的是指定一个对象可以或不可以被别名的情况。

相关问题