【问题标题】:error: invalid initialization of non-const reference of type 'std::function<void()>&' from an rvalue of type 'main()::<lambda()>'|错误:从 'main()::<lambda()>' 类型的右值对 'std::function<void()>&' 类型的非常量引用的初始化无效|
【发布时间】:2019-04-18 16:09:27
【问题描述】:

编辑:抱歉,我在没有了解参考资料的情况下问了这个问题...

当我运行这段代码时,我似乎遇到了这个错误......

错误:从 'main()::' 类型的右值对 'std::function&' 类型的非常量引用的初始化无效

#include <bits/stdc++.h>
using namespace std ;

void printfunction(bool a, function <void()> &b) 
{ 
    if (a == true) 
    {
        b() ; 
    }
} 

int main() 
{
    int value = 45 ;    

    printfunction(true, [value](){cout << "The value is : " << value ;}) ; 
}

但是,当我在函数之前添加const 时,错误消失...就像这样:

void printfunction(bool a,const function <void()> &b) 

问题是,如果需要,我想更改函数引用中的函数... 有没有其他方法可以做到这一点?请让我知道它是否确实存在。

再见,

塞缪尔

【问题讨论】:

  • C 语法错误,C 标签被移除
  • 那你为什么不按值取函数呢?
  • 这里有些东西没有意义。如果您更改函数,则无论如何更改都会丢失,因为调用者创建了一个临时函数。所以如果你想改变printfunction中的函数,那你就错了。您是否希望printfunction 获得该函数的私有副本,然后它可以在不影响调用者的情况下对其进行修改?

标签: c++ rvalue lvalue lvalue-to-rvalue


【解决方案1】:

如果你想修改std::function,那么你需要传递一个可修改的(左值)参数:

int main()
{
    int value = 45;

    std::function f = [value](){ std::cout << "The value is : " << value ;};

    printfunction(true, f);
}

您尝试做的与编写一个函数来获取对int 的可变引用(例如void foo(int&amp; x))然后抱怨您不能调用foo(5) 并没有太大区别。 (小的区别是 lambda 表达式被转换为临时的 std::function - 但仍然不能绑定到非常量引用)。


另一种方法是更改​​printfunction按值而不是通过引用来获取其参数,这样它就有自己的副本可以修改。您必须考虑调用者的需求来决定这是否更合适。

【讨论】:

    【解决方案2】:

    printfunction 调用中,lambda 表达式[value]() {...} 参数必须首先转换为临时function&lt;void()&gt; 对象。

    对非常量 function&lt;void()&gt;&amp; 的引用仅绑定到左值,而不是临时值(右值)。

    另一方面,对 const 的引用可以绑定到临时对象。这是你观察到的。

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 2012-01-07
      • 2021-10-26
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多