error: invalid initialization of non-const reference of type 'std::function<void()>&' from an rvalue of type 'main()::<lambda()>'|

error: invalid initialization of non-const reference of type 'std::function<void()>&' from an rvalue of type 'main()::<lambda()>'|

编辑:抱歉,我问这个问题时没有完全理解参考文献...

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

错误:从类型 '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) 

问题是,如果需要,我想更改函数参考中的函数... 还有其他方法吗?请让我知道它是否确实存在。

再见,

塞缪尔

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

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

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

如果你想修改 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 使其参数 通过值 而不是通过引用,以便它有自己的副本,它可以修改。您必须考虑来电者的需求来决定是否更合适。