2012-10-23 57 views
2

代碼與舊風格的轉換:什麼是老式演員的命名演員:pv =(void *)ps;

const string *ps;   
void *pv; 

pv = (void*)ps; 

我有嘗試3類名爲石膏:

pv = static_cast<void*>(ps); // error: invalid static_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’ 

pv = const_cast<void*>(ps); // error: invalid const_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’ 

pv = reinterpret_cast<void*>(ps); // error: reinterpret_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’ casts away qualifiers 

正如你所看到的。什麼都沒有

+0

嘗試dynamic_cast – lucasg

回答

4

在這種特殊情況下,它只是:

pv = const_cast<string*>(ps); 

string*void*的轉換是隱含的。如果你想 使其明確,你需要單獨的第二投:

pv = static_cast<void*>(const_cast<string*>(ps)); 

pv = const_cast<void*>(static_cast<void const*>(ps)); 

我不認爲擺明是尤爲必要,然而, 事實上,您使用的是void*已經表示將會有 轉換。

-1

我沒有嘗試 - 我想你2個演員 - 這不應該使用,因爲下面的鏈接。

pv = reinterpret_cast<void*>(const_cast<string*>(ps)); 

根據C++ 03的唯一安全的方法似乎是使用的static_cast從投/爲void *

pv = static_cast<void*>(const_cast<string*>(ps)); 

我不會,因爲它隱藏了鑄造使用隱式轉換。 但是你的演員看起來像一個壞主意 - 這是什麼情況?


我剛剛發現when to use reinterpret_cast現在我明白了爲什麼static_cast更好。儘管如此,我仍然不喜歡它,因爲它隱藏了(在我看來)鑄造的危險部分無效。在評論中,您可以輕鬆搜索所有reinterpret_casts並查看潛在的危險地點。

+2

reinterpret轉換不是必需的,並且可能有危險。指針自動轉換爲void指針,所以只需要const。 – PlasmaHH

10

您應該const_cast,但要正確的類型。從string*void*的劇組將自動發生。

pv = const_cast<string*>(ps); 
3

你必須先去除常量性,然後到static_cast:

pv = static_cast<void*>(const_cast<string*>(ps)); 
2

所有你需要的是一個const_cast,因爲轉換(但不從)void*自動發生(從轉換無效,使用static_cast):

pv = const_cast<string*>(ps);