c – 具有std :: function不同签名的Lambda函数

我不明白为什么第三种情况没问题(即使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;};

相关文章

首先GDB是类unix系统下一个优秀的调试工具, 当然作为debug代...
1. C语言定义1个数组的时候, 必须同时指定它的长度.例如:int...
C++的auto关键字在C+⬑新标准出来之前基本...
const关键字是用于定义一个不该被改变的对象,它的作用是告诉...
文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...