我在編寫C++時遇到了一些問題。問題可能如下所示。名爲「test」的函數返回一個指針。我試圖修改它,但錯誤信息失敗。當爲指針賦值時:表達式必須是可修改的左值
void* test(){ void * p1; return p1}
test() = new string();
錯誤:表達式必須是可修改的左值。 在我的情況下,p1不是局部變量,而是對象的某個成員。它也失敗了。
我在編寫C++時遇到了一些問題。問題可能如下所示。名爲「test」的函數返回一個指針。我試圖修改它,但錯誤信息失敗。當爲指針賦值時:表達式必須是可修改的左值
void* test(){ void * p1; return p1}
test() = new string();
錯誤:表達式必須是可修改的左值。 在我的情況下,p1不是局部變量,而是對象的某個成員。它也失敗了。
test()
返回一個指針,它不是一個變量,因此你不能分配任何東西給它。
如果你只是想要一個空指針,你可以使用void* variable_name = new string()
或任何你想分配給它。
@MikaelMello是正確的,你不能設置一個函數的值。
擴展你的代碼和@MikaelMello的,你可以採取的指針,你的函數返回,並使其指向這樣一個對象:
void* test(){ void * p1; return p1}
...
void* voidPointer = test();
voidPointer = new string();
左值必須是一個變量。它不能是一個功能。當我們使用賦值運算符「=」時,程序所做的是將賦值右側的值(稱爲右值)賦給左側值(稱爲左值)。所以左值必須是一個具有內存來存儲一些值的變量。
在你的程序中,左值是一個函數test(),它沒有任何內存來存儲任何東西,因此會引發語法錯誤。
函數test
返回類型爲void *
,因此表達式test()
是一個右值,它不能被賦值。只有左值可以出現在賦值運算符的左側。請參閱左值,右值等的explanation。
我猜你可能想取消引用一個指針併爲它指定一個新的值。但是如果你真的想分配一個函數的返回值,返回類型必須是一個左值引用類型。像
// this function returns a reference to a pointer
void * &test();
test() = new string;
你真的知道代碼應該是什麼意思,對嗎?如果您返回一個懸掛參考併爲其指定值,即使語法具有正確的類型,該程序仍然不正確。
如果p1是成員 - 你需要返回對它的引用才能分配給這個指針 –
不鼓勵使用「裸」指針。 (C++ 11爲你帶來了[智能指針](http://en.cppreference.com/w/cpp/memory),使用它們。)拋棄指針作爲'void *'(因此放棄類型安全性)*非常*不鼓勵。 – DevSolar
即使您*被允許分配給返回的指針,返回的值是* p1的副本*,因此分配給它並不會改變'p1'。所以會很無用。 –