2011-08-27 115 views
0

對於具有void *參數的方法,C++使用static/reinterpret_cast來進行轉換,或者在這裏有不同的機制嗎?void *作爲方法參數的轉換

void foo(void* p) 
{ 
    // ... use p by casting it back to Base first, using static/reinterpret cast 
} 
Base* base(new Derived); 
foo(base);  // at this exact line, is there a static/reinterpret_cast going on under the covers? 

我問,因爲它似乎是一方面的標準說,對於C樣式轉換,C++會去嘗試一個C++投(靜態,重新詮釋,常量),直到一些被發現的作品。然而,我無法找到一個合理的解釋,當有一個void *參數的方法被調用時會發生什麼。在事情面前沒有演員,所以會發生什麼?

回答

4

在這種情況下,語言規範不會根據static_castreinterpret_cast表示行爲。它只是說指針base隱式轉換爲void *類型。可以隱式執行的轉換在C++中稱爲標準轉換。任何對象指針類型轉換爲void *指針轉換類別的標準轉換之一。

確實,這是可以由static_cast明確執行的相同轉換,但static_cast在這種情況下完全不相關。 C++中的標準轉換「自行」工作,不涉及任何特定的演員操作員。

實際上,這是static_cast的行爲,它是根據這種情況下的標準轉換來定義的,而不是其他方式。

+1

而從'T *'轉換爲'void *'的關鍵是最終的'void *'必須指向'T'對象的存儲位置的開始 - 這就是你想要的可能期望。但是我認爲,預期的行爲是標準中要求的(因爲標準需要預期的行爲並不總是這種情況)。 –

+0

把'T *'轉換爲'void *'(其中'T'是一個對象類型)的另一個重要屬性是轉換回'T *'(它確實需要一個靜態轉換)會將原始值。 –

+0

不考慮()(void *)方法的全局用處,你如何在foo()中使用p?你必須將其轉換回類型。但是,如果您將其重新投入使用,則您在主叫方有一個隱式轉換,而在被叫方有一個明確的轉換 - 這是一種不對稱的情況。在這種情況下,你不必假設發生的「隱式」轉換實際上是一種靜態轉換嗎? –

相關問題