template<class T>
void f(T&& a)
{
static_assert(std::is_rvalue_reference_v<decltype(a)>);
}
void g(int&& i)
{
}
int main()
{
auto test_lambda = [](){}
int i = 0;
auto test = [l{std::move(test_lambda)}, j{i}]()
{
f(std::move(l)); // pass compilation, pass static_assert;
g(std::move(j)); // fail, can't cast const int to int&&
}
}
l虽然也value-capture, 但是不受lambda的const限制,j确受到限制。查了很多地方没有说为什么,查了仔细都了lambda的标准,也没有明确说,唯一可以解释的地方就是"lambda is a closure",所以lambda和functor还是有区别。
--
FROM 60.191.0.*