错误:从类型为'main():: <lambda()>'|的右值的类型'std :: function <void()>&'的非常量引用无效的初始化|

时间:2018-11-15 14:17:17

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

编辑:抱歉,我问这个问题时并不了解参考文献...

运行此代码时似乎出现此错误...

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

再见

塞缪尔

2 个答案:

答案 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以使其参数通过值而不是通过引用,以使其具有自己的副本,可以对其进行修改。您必须考虑呼叫者的需求,以决定是否更合适。