0

這些代碼工作完美:C++使用函數結果作爲參數

#include <ctime> 


int main() 
{ 
    time_t t; 
    struct tm* now; 

    t = time(0);   // Here is my attention 
    now = localtime(&t); // and here 

    return 0; 
} 

現在我想在if語句以此作爲條件,所以我想這樣做在同一行。我試試這個代碼:

now = localtime(&(time(0))); 

但我得到的錯誤:

E0158 expression must be an lvalue or a function designator

爲什麼我不能調用一個函數另一個函數內,並使用它作爲結果參數?

P.S.我正在Visual Studio 2017中工作。

+0

您嘗試獲取存儲在堆棧中的值的引用。 – Check

+0

@Check't'在「堆棧」上(有自動存儲時間)。 – LogicStuff

+0

您可以使用函數的結果作爲參數,但'&(time(0))'不是函數的結果,'time(0)'是。 – molbdnilo

回答

0

術語&variable可以得到左值的地址。左值是任何可以賦值給它的值,因此具有有效的內存地址。如果考慮函數的返回值,則不能指定:

time(0) = 3; 

是沒有意義的。這就是爲什麼你不能得到它的地址。 time(0)3都是右值引用。所有右值引用(如果未捕獲)都將在表達式末尾銷燬,這可能是下一個分號或右括號。

如果要定義接受你必須給它下面的簽名右值引用的函數:

void function(int&& param) 

&&表示的右值引用。

+0

_所有右值引用,如果沒有捕獲,都會在下一個分號處被銷燬_這並不完全正確。它在表達式的末尾,可能或不可能以分號結尾。 –

+0

好的,當然。如果它是一個右括號,那麼它會在那裏結束。我會修復它 – kim366

-1

請看看這個SO answer關於左值和右值,因爲它提供了更詳細的解釋。

但它基本上繞了這個:
&運算符取對象的地址。一個函數調用的結果是一個臨時對象(一個右值),它在調用後最終被銷燬(我不確定何時)。
取一個右值的地址會導致一個懸掛指針,因此被禁止。

+0

如果這個問題已經在SO上得到解答 - 將其標記爲重複,不要試圖解釋它。 –