#include <iostream>
#include <vector>
#include <functional>
#include <type_traits>
int main()
{
std::vector<int>v = {0,1,2,3,4,5,6};
auto f_lambda = [&v](int i) { return v[i];};
std::function<const int&(int)> f = f_lambda;
auto g_lambda = [&v](int i) -> const int& { return v[i];};
std::function<const int&(int)> g = g_lambda;
std::cout << std::is_same<decltype(f_lambda(3)), int>::value << "\n";
std::cout << std::is_same<decltype(f_lambda(3)), const int&>::value << "\n";
std::cout << std::is_same<decltype(g_lambda(3)), int>::value << "\n";
std::cout << std::is_same<decltype(g_lambda(3)), const int&>::value << "\n";
std::cout << f(3) << ' ' << g(3) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKaW50IG1haW4oKSAKewogICAgc3RkOjp2ZWN0b3I8aW50PnYgPSB7MCwxLDIsMyw0LDUsNn07CiAgICBhdXRvIGZfbGFtYmRhID0gWyZ2XShpbnQgaSkgeyByZXR1cm4gdltpXTt9OwogICAgc3RkOjpmdW5jdGlvbjxjb25zdCBpbnQmKGludCk+IGYgPSBmX2xhbWJkYTsgCiAgICBhdXRvIGdfbGFtYmRhID0gWyZ2XShpbnQgaSkgLT4gY29uc3QgaW50JiB7IHJldHVybiB2W2ldO307CiAgICBzdGQ6OmZ1bmN0aW9uPGNvbnN0IGludCYoaW50KT4gZyA9IGdfbGFtYmRhOwoKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoZl9sYW1iZGEoMykpLCBpbnQ+Ojp2YWx1ZSA8PCAiXG4iOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShmX2xhbWJkYSgzKSksIGNvbnN0IGludCY+Ojp2YWx1ZSA8PCAiXG4iOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShnX2xhbWJkYSgzKSksIGludD46OnZhbHVlIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjppc19zYW1lPGRlY2x0eXBlKGdfbGFtYmRhKDMpKSwgY29uc3QgaW50Jj46OnZhbHVlIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgZigzKSA8PCAnICcgPDwgZygzKSA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQ==