编辑:抱歉,我问这个问题时并不了解参考文献...
运行此代码时似乎出现此错误...
错误:类型'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)
问题是如果需要,我想在函数引用中更改函数... 还有其他方法吗?请让我知道它是否确实存在。
P.S:我正在使用代码::块16.01
再见
塞缪尔
答案 0 :(得分:2)
在printfunction
调用中,必须先将lambda表达式[value]() {...}
参数转换为临时function<void()>
对象。
对非常量function<void()>&
的引用仅绑定到l值,而不绑定到临时值(r值)。
另一方面,对const的引用可以绑定到临时对象。您观察到的是什么。
答案 1 :(得分:2)
如果要修改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)
)进行可变引用然后抱怨不能调用{{1}的函数没有太大不同。 }。 (小的区别在于,lambda表达式已转换为临时foo(5)
,但仍不能绑定到非const引用。)
另一种选择是更改std::function
以使其参数通过值而不是通过引用,以使其具有自己的副本,可以对其进行修改。您必须考虑呼叫者的需求,以决定是否更合适。