为什么我不能在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
的拷贝/移动!
上一篇: Why can't I create a vector of lambdas (of the same type) in C++11?