std::function 作为 & 发送的(非)常量输入参数
std::function as a (non) const input parameter sent by &
我想知道为什么 std::function<...(...)> &
在作为输入参数传递给函数时需要指定为 const
。 AFAIK 没有办法改变它,对吧?这是一个可以正常编译和运行的示例。如果我删除 const
限定符,我会得到一个错误:
#include <iostream>
#include <functional>
//int foo(std::function<int(int)> &f)
int foo(const std::function<int(int)> &f)
{
return f(6);
}
int main(int argc, char **argv)
{
auto f1 = [=](int i){ if (i<5) {return 8*2;} else {return 2;} };
auto f2 = [=](int i){ if (i>3) {return i*i;} else {return 2;} };
std::cout << foo(f1) << "\n";
}
当我使用不带 const
的声明时,出现以下错误:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:13:21: error: cannot bind non-const lvalue reference of type ‘std::function<int(int)>&’ to an rvalue of type ‘std::function<int(int)>’
std::cout << foo(f1) << "\n";
^
In file included from /usr/include/c++/7/functional:58:0,
from main.cpp:2:
/usr/include/c++/7/bits/std_function.h:685:7: note: after user-defined conversion: std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = main(int, char**)::<lambda(int)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = int; _ArgTypes = {int}]
function<_Res(_ArgTypes...)>::
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:4:5: note: initializing argument 1 of ‘int foo(std::function<int(int)>&)’
int foo(std::function<int(int)> &f)
^~~
lambda 不是 std::function
,但是可以从 lambda 创建 std::function
。当您将 f1
或 f2
传递给 foo()
时,编译器必须构造一个临时 std::function
对象以提供给 f
参数。但是,对非 const
对象的 左值引用 不能绑定到临时对象,正如错误消息所说。
要允许传递临时对象,必须通过以下任一方式更改 f
参数以采用 std::function
:
- 价值
- 对
const
对象的左值引用
- 右值引用
否则,您必须自己在变量中构建 std::function
,然后传递它:
#include <iostream>
#include <functional>
//int foo(const std::function<int(int)> &f)
int foo(std::function<int(int)> &f)
{
return f(6);
}
int main(int argc, char **argv)
{
auto f1 = [=](int i){ if (i<5) {return 8*2;} else {return 2;} };
auto f2 = [=](int i){ if (i>3) {return i*i;} else {return 2;} };
std::function<int(int)> f = f1;
std::cout << foo(f) << "\n";
}
我想知道为什么 std::function<...(...)> &
在作为输入参数传递给函数时需要指定为 const
。 AFAIK 没有办法改变它,对吧?这是一个可以正常编译和运行的示例。如果我删除 const
限定符,我会得到一个错误:
#include <iostream>
#include <functional>
//int foo(std::function<int(int)> &f)
int foo(const std::function<int(int)> &f)
{
return f(6);
}
int main(int argc, char **argv)
{
auto f1 = [=](int i){ if (i<5) {return 8*2;} else {return 2;} };
auto f2 = [=](int i){ if (i>3) {return i*i;} else {return 2;} };
std::cout << foo(f1) << "\n";
}
当我使用不带 const
的声明时,出现以下错误:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:13:21: error: cannot bind non-const lvalue reference of type ‘std::function<int(int)>&’ to an rvalue of type ‘std::function<int(int)>’
std::cout << foo(f1) << "\n";
^
In file included from /usr/include/c++/7/functional:58:0,
from main.cpp:2:
/usr/include/c++/7/bits/std_function.h:685:7: note: after user-defined conversion: std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = main(int, char**)::<lambda(int)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = int; _ArgTypes = {int}]
function<_Res(_ArgTypes...)>::
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:4:5: note: initializing argument 1 of ‘int foo(std::function<int(int)>&)’
int foo(std::function<int(int)> &f)
^~~
lambda 不是 std::function
,但是可以从 lambda 创建 std::function
。当您将 f1
或 f2
传递给 foo()
时,编译器必须构造一个临时 std::function
对象以提供给 f
参数。但是,对非 const
对象的 左值引用 不能绑定到临时对象,正如错误消息所说。
要允许传递临时对象,必须通过以下任一方式更改 f
参数以采用 std::function
:
- 价值
- 对
const
对象的左值引用 - 右值引用
否则,您必须自己在变量中构建 std::function
,然后传递它:
#include <iostream>
#include <functional>
//int foo(const std::function<int(int)> &f)
int foo(std::function<int(int)> &f)
{
return f(6);
}
int main(int argc, char **argv)
{
auto f1 = [=](int i){ if (i<5) {return 8*2;} else {return 2;} };
auto f2 = [=](int i){ if (i>3) {return i*i;} else {return 2;} };
std::function<int(int)> f = f1;
std::cout << foo(f) << "\n";
}