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
使其参数 通过值 而不是通过引用,以便它有自己的副本,它可以修改。您必须考虑来电者的需求来决定是否更合适。
编辑:抱歉,我问这个问题时没有完全理解参考文献...
当我 运行 这段代码时,我似乎遇到了这个错误...
错误:从类型 '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
使其参数 通过值 而不是通过引用,以便它有自己的副本,它可以修改。您必须考虑来电者的需求来决定是否更合适。