2017-09-06 133 views
-4

我在編寫C++時遇到了一些問題。問題可能如下所示。名爲「test」的函數返回一個指針。我試圖修改它,但錯誤信息失敗。當爲指針賦值時:表達式必須是可修改的左值

void* test(){ void * p1; return p1} 
test() = new string(); 

錯誤:表達式必須是可修改的左值。 在我的情況下,p1不是局部變量,而是對象的某個成員。它也失敗了。

+0

如果p1是成員 - 你需要返回對它的引用才能分配給這個指針 –

+4

不鼓勵使用「裸」指針。 (C++ 11爲你帶來了[智能指針](http://en.cppreference.com/w/cpp/memory),使用它們。)拋棄指針作爲'void *'(因此放棄類型安全性)*非常*不鼓勵。 – DevSolar

+0

即使您*被允許分配給返回的指針,返回的值是* p1的副本*,因此分配給它並不會改變'p1'。所以會很無用。 –

回答

2

test()返回一個指針,它不是一個變量,因此你不能分配任何東西給它。

如果你只是想要一個空指針,你可以使用void* variable_name = new string()或任何你想分配給它。

1

@MikaelMello是正確的,你不能設置一個函數的值。

擴展你的代碼和@MikaelMello的,你可以採取的指針,你的函數返回,並使其指向這樣一個對象:

void* test(){ void * p1; return p1} 
... 
void* voidPointer = test(); 
voidPointer = new string(); 
0

左值必須是一個變量。它不能是一個功能。當我們使用賦值運算符「=」時,程序所做的是將賦值右側的值(稱爲右值)賦給左側值(稱爲左值)。所以左值必須是一個具有內存來存儲一些值的變量。

在你的程序中,左值是一個函數test(),它沒有任何內存來存儲任何東西,因此會引發語法錯誤。

0

函數test返回類型爲void *,因此表達式test()是一個右值,它不能被賦值。只有左值可以出現在賦值運算符的左側。請參閱左值,右值等的explanation

我猜你可能想取消引用一個指針併爲它指定一個新的值。但是如果你真的想分配一個函數的返回值,返回類型必須是一個左值引用類型。像

// this function returns a reference to a pointer 
void * &test(); 
test() = new string; 

你真的知道代碼應該是什麼意思,對嗎?如果您返回一個懸掛參考併爲其指定值,即使語法具有正確的類型,該程序仍然不正確。

相關問題