使用带有lambda的decltype和std :: function

lea*_*vst 9 c++ lambda function decltype c++11

这有效......

auto x = 4;
typedef decltype(x) x_t;
x_t y = 5;
Run Code Online (Sandbox Code Playgroud)

......为什么不呢?

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;};
Run Code Online (Sandbox Code Playgroud)

...我将如何lambda_t使用std :: function手动声明?

R. *_*des 14

...那为什么不这[工作]?

因为lambda的每个词法实例都有不同的类型.如果使用相同的字符则无关紧要.

..以及如何使用std :: function手动声明lambda_t?

lambda采用int参数,不返回任何内容......因此:

typedef std::function<void(int)> lambda_t;
Run Code Online (Sandbox Code Playgroud)


Dav*_*eas 7

LAMBDA类型是难言的(不能被命名),这是你不能做你的要求的原因.除此之外,每个lambda都是不同的类型,所以即使你可以命名类型,你也无法将第二个lambda分配给第一个lambda.如果您认为lambda语法是一个更清晰的函数对象的快捷方式:成员operator()每个lambda都是不同的,因此它们的类型不同.

另一方面,您可以将lambda分配给std::function<>相应签名的对象,在您的情况下也是如此std::function<void(int)>.

  • @learnvst:它不是无法使用的垃圾.但是我在http://stackoverflow.com/questions/11628765/why-do-lambda-functions-in-c11-not-have-function-types/11629125#11629125之前回答了你的问题 (2认同)