这有效......
auto x = 4;
typedef decltype(x) x_t;
x_t y = 5;
...为什么不呢?
int j = 4;
auto func = [&] (int i) { cout << "Hello: i=" << i << " j=" << j << endl;};
typedef decltype(func) lambda_t;
lambda_t func2 = [&] (int i) { cout << "Bye: i=" << i << " j=" << j << endl;};
...我如何使用std :: function手动声明lambda_t
?
答案 0 :(得分:14)
...为什么这不[工作]?
因为lambda的每个词法实例都有不同的类型。如果使用相同的字符则无关紧要。
..如何使用std :: function手动声明lambda_t?
lambda采用int参数并且不返回任何内容......因此:
typedef std::function<void(int)> lambda_t;
答案 1 :(得分:7)
Lambda类型是无法解释的(无法命名),这就是你不能做你要求的原因。除此之外,每个lambda都是不同的类型,所以即使你可以命名类型,你也无法将第二个lambda分配给第一个lambda。如果您认为lambda语法作为函数对象的快捷方式变得更加清晰:成员operator()
对于每个lambda都是不同的,因此它们的类型不同。
另一方面,您可以将lambda分配给相应签名的std::function<>
对象,在您的情况下为std::function<void(int)>
。
答案 2 :(得分:0)
这里有一些确凿的证据证明这不起作用。类似的情况:
int foo = 3;
int bar = 3;
std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints one -- obviously - they are the same type
现在,让我们使用完全相同的代码,但使用lambdas。您认为回应是什么。
auto foo = [](){std::cout << "HELLO\n"; };
auto bar = [](){std::cout << "HELLO\n"; };
std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints 0 -- different type even though they are declared exactly the same.