(5.2.10/6)C++ 03指向函數的指針可以顯式轉換爲指向不同類型函數的指針。通過一個指向函數類型(8.3.5)調用函數 的效果是不一樣的 在函數的定義中使用的類型是未定義的。除了 該類型的右值轉換「指針T1」的類型「指針 到T2」(其中,T1和T2是功能類型),並且返回到其原始 類型產生的原始指針值,這樣的指針的結果 轉換未指定。 [注:也見4.10爲 指針轉換詳情]將函數指針轉換爲指向函數類型的指針的結果
以下是我想要做的,而很顯然,轉換fp1
到fp2
的結果會產生一個原始的指針,但在同一時間標準的措辭是"The result of such a pointer conversion is unspecified"
這是什麼意思?
int f() { return 42; }
int main()
{
void(*fp1)() = reinterpret_cast<void(*)()>(f);
int(*fp2)() = reinterpret_cast<int(*)()>(fp1);
// Safe to call the function ?
fp2();
}
我想其他的轉換就像'f'到'fp1'在我的情況下,對嗎? – user1086635
@user:是的,沒有指定'fp1'的內容,但是如果您轉換回原始類型,則會返回原始值。 – sth
未定義的行爲是,如果你試圖做'(* fp1)();'。這會調用一個返回'int'的函數,就像它返回'void'一樣。至少這取決於你的架構的ABI。如果它使用舊的C方法,在調用函數之前爲堆棧中返回的對象分配空間,那麼在這種情況下,它不會爲返回的「int」分配空間(因爲它認爲沒有返回值),並且被調用的函數會將其返回值放在錯誤的地方(例如覆蓋返回地址),並且事情從此處下坡。 –