2012-01-07 94 views
2

注意:這不是在標題中帶有該名稱的十億個和一個問題的重複。這與指針和非常奇怪的東西有關,而不是意外的=而不是==「在奇數位置需要作爲賦值左操作數的左值」 - C++

我有一個C++函數,其中有一個void*參數,稱爲out。我有這樣一行:

(char*)out=new char[*size]; 

sizeuint32_t*。編譯器抱怨:

fundemental_bin_types.h:55:32: error: lvalue required as left operand of assignment 

什麼是錯?

+2

爲什麼你認爲你需要在這裏鑄('(char *)')? – 2012-01-07 00:11:17

+1

'(char *)'? 'void *',通過指針傳遞一個POD? 'new char []'?你確定*這是C++嗎? – Johnsyweb 2012-01-07 00:17:07

+0

是的。非常奇怪的C++。非常奇怪的C++。這是一組必須被函數指針引用的函數的一部分。他們都需要能夠返回任何類型的數據,但只有他們和最終調用者知道類型。中間代碼(我的主代碼)不知道類型是什麼,所以我們必須將'int's和'char's作爲'void *'來傳遞。 – Linuxios 2012-01-07 00:19:44

回答

7

(char*)out左值(out本身可能是,但劇組變化的東西),演員所屬的賦值的另一邊,你鑄造一個空指針,而不是一個字符指針:

out = (void*) (new char[*size]); 

在任何情況下,void*是從其他指針隱式轉換,所以你可以逃脫只是:

out = new char[*size]; 
+0

爲什麼你認爲演員是必需的? – 2012-01-07 00:13:33

0

取出(char*),因爲它在這裏沒有任何用處。 (或者它有一些目的,你沒有解釋。)

如果你有一個void *參數,你不能簡單地分配給它(爲了讓該指針看到的指針),就像你可以void*&論據。

1

C指針轉換會創建一個左值; C++指針轉換不會轉換爲引用類型。即,下面應該編譯:

(char *&)out= new char[*size]; 
相關問題