【问题标题】:c++ using function result as an argument [duplicate]c ++使用函数结果作为参数[重复]
【发布时间】:2018-01-24 06:00:47
【问题描述】:

这些代码完美运行:

#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 表达式必须是左值或函数指示符

为什么我不能在另一个函数内部调用一个函数并将其结果用作参数?

附:我在 Visual Studio 2017 中工作。

【问题讨论】:

  • 您尝试获取存储在堆栈中的值的引用。
  • @Check t 也在“堆栈”上(具有自动存储持续时间)。
  • 你可以使用函数的结果作为参数,但&amp;(time(0))不是函数的结果,time(0)是。
  • 您无法获取右值的地址。查看this 以了解有关术语的说明。
  • 谢谢,我想说的和你一样@muXXmit2X 但我说错了。^^

标签: c++ visual-studio function parameter-passing pass-by-reference


【解决方案1】:

术语&amp;variable 为您提供左值的地址。左值是可以分配给它的值并因此具有有效内存地址的任何东西。如果你考虑一个函数的返回值,你不能给它赋值:

time(0) = 3;

没有意义。这就是为什么你不能得到它的地址。 time(0)3 都是右值引用。所有的右值引用,如果没有被捕获,就会在表达式的末尾被销毁,这可能是下一个分号或右括号。

如果你想定义一个接受右值引用的函数,你必须给它以下签名:

void function(int&& param)

&amp;&amp; 表示右值引用。

【讨论】:

  • 所有右值引用,如果没有被捕获,将在下一个分号处被销毁 这并不完全正确。它位于表达式的末尾,它可能以分号结尾,也可能不以分号结尾。
  • 好的,当然。如果它是一个右括号,那么它会在那里结束。我会解决的
【解决方案2】:

请查看此SO answer 关于左值和右值,因为它提供了更详细的解释。

但它基本上围绕着这个:
&amp; 运算符获取对象的地址。函数调用的结果是一个临时对象(一个右值),它最终在调用后被销毁(我不确定到底是什么时候)。
获取右值的地址会导致指针悬空,因此被禁止。

【讨论】:

  • 如果问题已经在 SO 上得到回答 - 将其标记为重复,不要试图解释它。
猜你喜欢
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2021-04-17
  • 1970-01-01
  • 2011-04-07
  • 2011-11-18
相关资源
最近更新 更多