2017-09-04 93 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)這個列表的目的是指定一個對象可以或不可以被別名的情況。

相關問題