-1

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

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

错误:从“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 ;}) ; 
}

但是,当我添加一个before 函数时,错误消失了......就像这样:const

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

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

再见,

塞缪尔

4

2 回答 2

3

在调用中,必须先将printfunctionlambda 表达式参数转换为临时对象。[value]() {...}function<void()>

对非常量的引用function<void()>&只绑定到左值,而不是临时值(右值)。

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

于 2018-11-15T14:27:30.380 回答
3

如果要修改std::function,则需要传递可修改的(左值)参数:

int main()
{
    int value = 45;

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

    printfunction(true, f);
}

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


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

于 2018-11-15T14:28:11.010 回答