2012-11-29 52 views
9

这工作功能...使用decltype和std ::与拉姆达

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

回答

14

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

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

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

拉姆达带一个int参数,不返回任何东西。所以:

typedef std::function<void(int)> lambda_t; 
7

拉姆达类型难言(不能被命名),这是你不能做什么原因你在问。除此之外,每个lambda都是不同的类型,所以即使你可以命名该类型,也不能将第二个lambda指定给第一个lambda。如果将lambda语法看作函数对象的快捷方式,则会变得更清晰:成员operator()对于每个lambda都不相同,因此它们具有不同的类型。

另一方面,您可以将lambda分配给合适签名的std::function<>对象,在您的情况下该对象将为std::function<void(int)>

+0

你当然可以用这样的decltype typedef lambda表达式。 –

+1

@ R.MartinhoFernandes乞求问题为什么'decltype(func)'不返回'std :: function '而不是一些不可用的垃圾? – learnvst

+1

@learnvst:为什么要这样? 'decltype'返回声明的类型,而lambda则不是* std :: function'。另外,由于类型擦除,'std :: function'具有性能问题。 – Xeo

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.