[英]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的頁面說一個可以:
那么,合並后兩個是否安全?
我不知道“安全”的含義,但是使用此代碼的程序的行為是不確定的。 您可以將指針轉換為足以容納該值的整數類型,也可以將該值轉換回與原始類型相同的指針。 問題中的代碼不會執行此操作:它將值轉換為指針類型與原始類型不同的指針。
在那種特殊情況下,代碼是安全的。 那是因為of 投的安全性。 公共繼承始終允許這樣做, 而無需顯式類型強制轉換 。
簡而言之,您只是強行將某些內容視為隱性。
用uintptr_t
B
類型的地址也是無用的,但由於“ 相同類型 ”而被允許。
關於uintptr_t
。
整數類型,它可以保存從void指針轉換后的值,然后將其轉換回具有與原始指針相等的值的該類型。
注意“ 比較等於原始指針 ”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.