这些代码完美无缺:
#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表达式必须是左值或函数指示符
为什么我不能在另一个函数内部调用函数并将其结果用作参数?
P.S。我在Visual Studio 2017中工作。
答案 0 :(得分:0)
术语&variable
为您提供左值的地址。左值是可以赋值给它的任何值,因此具有有效的内存地址。如果考虑函数的返回值,则无法分配给它:
time(0) = 3;
毫无意义。这就是为什么你无法得到它的地址。 time(0)
和3
都是右值引用。所有右值引用(如果未捕获)将在表达式的末尾销毁,这可能是下一个分号或右括号。
如果你想定义一个接受右值引用的函数,你必须给它以下签名:
void function(int&& param)
&&
表示右值参考。
答案 1 :(得分:-1)
请查看此SO answer关于左值和左值的信息,因为它提供了更详细的解释。
但它基本上包含了这个:
&
运算符获取对象的地址。函数调用的结果是一个临时对象(一个rvalue),它最终会在调用后被销毁(我确实不确定的时候)。
取rvalue的地址会导致悬空指针,因此被禁止。