int* b = new int(40);
int c = *(int *)b;
上述演員作業正常。
但是類似的轉換不適用于函式指標
void abc(int a){
cout<<a<<endl;
}
std::function<void(int)> callback = *(std::function<void(int)>*)abc; // this cast is not working
上面這段代碼有什么問題?
uj5u.com熱心網友回復:
您b轉換為它已有的相同型別。這會導致靜態轉換,不會更改值。的型別b是int*并且您轉換為int*.
您abc轉換為完全不同的型別。并且由于目標型別是不相關的,這導致重新解釋轉換,并通過重新解釋的指標訪問指向的物件(這是一個問題,因為它指向一個函式而不是一個物件)導致未定義的行為。的型別abc就是void(int)該函式型別和它隱含衰減到void(*)(int)它是一個指向函式型別。您將其std::function<void(int)>*強制轉換為指向物件型別的指標,其中物件型別屬于從類模板實體化的型別別std::function。
上面這段代碼有什么問題?
- 使用 C 樣式轉換是錯誤的。不要這樣做。
- 重新解釋將指標轉換為不相關的型別是錯誤的。
std::function<...>*不是指向函式的指標。std::function不是函式。它是函式包裝器的類模板。
uj5u.com熱心網友回復:
std::function<void(int)> 不是函式。這是一個帶有operator(). 它有一個建構式,您需要呼叫它來創建該類的實體。例如像這樣:
std::function<void(int)> callback = abc;
另一方面,這里:
int* b = new int(40);
int c = *(int *)b;
new int(40)確實創建了一個int物件并且b是指向該物件的指標。演員表(int*)b不做任何事情,因為b已經是 a int*,您可以取消參考以將 的值分配int給c。
我盡量保持簡單,為了更準確地解釋代碼中實際發生的情況,我向您推薦這個答案:https : //stackoverflow.com/a/70166958/4117728。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/370431.html
上一篇:識別記憶體管理問題
下一篇:c中結構指標內的雙陣列
