具有与 std::function 不同签名的 lambda 函数

Lambda function with different signatures from std::function

本文关键字:函数 lambda std function      更新时间:2023-10-16

我不明白为什么第三种情况没问题(即使lambda的参数类型与std::function类型不同),而编译器抱怨第四种情况:

function<int(int)> idInt = [](int i) {return i;}; //OK
function<int(int&)> idInt = [](int &i) {return i;}; //OK
function<int(int&)> idInt = [](int i) {return i;}; //OK
function<int(int)> idInt = [](int &i) {return i;}; //ERROR!

当你写:

function<int(int)> idInt = [](int &i) {return i;}; //ERROR!

然后你说idInt可以包装一个函数,闭包,..可以用int参数调用。但是在[](int &i) {return i;};的情况下并非如此,因为你不能像这里这样用积分文字来调用它:

auto fn = [](int &i) {return i;};
fn(1); // error - you try to bind temporary to reference

您可以通过更改签名以使用右值引用或 const&来修复它:

std::function<int(int)> idInt1 = []( int &&i) {return i;};
std::function<int(int)> idInt2 = []( const int &i) {return i;};