为什么我不能在C ++ 11中创建一个lambda表达式(相同类型的)?

我试图创建一个lambda矢量,但失败了:

auto ignore = [&]() { return 10; };  //1
std::vector<decltype(ignore)> v;     //2
v.push_back([&]() { return 100; });  //3

直到第二行,它编译得很好。 但#3行给出编译错误:

错误:没有用于调用'std :: vector <main():: lambda()>> :: push_back(main():: <lambda()>)的匹配函数'

我不想要函数指针向量或函数对象向量。 然而,封装真正的lambda表达式的函数对象的向量对我来说很有用。 这可能吗?


每个lambda都有不同的类型 - 即使它们具有相同的签名。 如果你想做类似的事情,你必须使用运行时封装容器,如std::function

例如:

std::vector<std::function<int()>> functors;
functors.push_back([&] { return 100; });
functors.push_back([&] { return  10; });

所有的lambda表达式都有不同的类型,即使它们是逐个字符也是一样的。 你将一个不同类型的lambda表达式(因为它是另一个表达式)推入向量中,而这显然不起作用。

一种解决方案是改用std::function<int()>的向量。

auto ignore = [&]() { return 10; };
std::vector<std::function<int()>> v;
v.push_back(ignore);
v.push_back([&]() { return 100; });

另一方面,当你没有捕获任何东西时,使用[&]并不是一个好主意。


虽然其他人所说的是相关的,但仍然可以声明和使用lambda矢量,尽管它并不是非常有用:

auto lambda = [] { return 10; };
std::vector<decltype(lambda)> vector;
vector.push_back(lambda);

所以,你可以在那里存储任意数量的lambda,只要它是lambda的拷贝/移动!

链接地址: http://www.djcxy.com/p/67649.html

上一篇: Why can't I create a vector of lambdas (of the same type) in C++11?

下一篇: Column render, listen to click event of a <i> tag?