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上得到解答 - 将其标记为重复,不要试图解释它。 –