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

时间:2012-11-29 18:02:45

标签: c++ function c++11 lambda decltype

这有效......

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

3 个答案:

答案 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.