10

这有效...

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;};

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

4

3 回答 3

14

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

因为 lambda 的每个词法实例都有不同的类型。是否使用相同的字符并不重要。

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

lambda 接受一个 int 参数并且不返回任何内容......因此:

typedef std::function<void(int)> lambda_t;
于 2012-11-29T18:07:40.033 回答
8

Lambda 类型是无法说出的(无法命名),这就是您无法按照您的要求做的原因。除此之外,每个 lambda 都是不同的类型,因此即使您可以命名类型,也无法将第二个 lambda 分配给第一个。如果您将 lambda 语法视为更清晰的函数对象的快捷方式:operator()每个 lambda 的成员都不同,因此它们属于不同的类型。

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

于 2012-11-29T18:10:12.873 回答
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.
于 2015-04-25T00:01:07.253 回答