簡體   English   中英

reinterpret_cast指向帶有向上轉換指針的整數

[英]reinterpret_cast integer to pointer with upcast

以下代碼安全嗎:

#include <iostream>
#include <cstdint>

struct A{
  int i = 0;
  virtual int foo() {return i;}
};
struct B : A{
  int foo() override {return i+2;}
};

using handle_t = std::uintptr_t;
handle_t get(B& a){
  return reinterpret_cast<handle_t>(&a);
}

void use(handle_t h){
  auto p= reinterpret_cast<A*>(h); // 
  std::cout << p->foo() << "\n";
}

int main(int argc, char *argv[])
{
  B a;
  auto h = get(a);
  use(h);
  return 0;
}

CppReference的頁面說一個可以:

  • 從B *重新解析到std :: uintptr_t
  • 從std :: uintptr_t到B *的reinterpret_cast(因為它是來回相同的類型)
  • 從B *重新解釋到A *

那么,合並后兩個是否安全?

我不知道“安全”的含義,但是使用此代碼的程序的行為是不確定的。 您可以將指針轉換為足以容納該值的整數類型,也可以將該值轉換回與原始類型相同的指針。 問題中的代碼不會執行此操作:它將值轉換為指針類型與原始類型不同的指針。

在那種特殊情況下,代碼是安全的。 那是因為of 的安全性。 公共繼承始終允許這樣做, 而無需顯式類型強制轉換

簡而言之,您只是強行將某些內容視為隱性。

uintptr_t B類型的地址也是無用的,但由於“ 相同類型 ”而被允許。

編輯

關於uintptr_t

整數類型,它可以保存從void指針轉換后的值,然后將其轉換回具有與原始指針相等的值的該類型。

注意“ 比較等於原始指針 ”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM