繁体   English   中英

错误:类型“std::function”的非常量引用的初始化无效<void()> &amp;&#39; 来自 &#39;main():: 类型的右值<lambda()> &#39;|

[英]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之前添加一个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按值而不是按引用获取其参数,以便它拥有自己可以修改的副本。 您必须考虑调用者的需求来决定这是否更合适。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM