C++ lambda 自动类型推导

c++ lambda auto type deduction

我正在尝试理解为什么这段代码无法编译:

void test_fff()
{
    auto f1 = [](int x) {return x;};
    decltype(f1) f2 = [](int y) {return y;};
}

这是我遇到的编译错误:

error: conversion from 'test_fff()::<lambda(int)>' to non-scalar type 'test_fff()::<lambda(int)>' requested 177 | decltype(f1) f2 = [](int y) -> int {return y;};

我正在使用 g++ 10.2.0 和 -std=c++17

但是,这段代码编译得很好:

void test_fff()
{
    FFF<decltype(2)>::foo(2);

    std::function<int (int)> f1 = [](int x) {return x;};
    decltype(f1) f2 = [](int y) {return y;};
}

两者有什么区别?

What's the difference between the two?

两者的区别在于第一种情况:

auto f1 = [](int x) {return x;};
decltype(f1) f2 = [](int y) {return y;};

f1 的类型(因此 decltype(f1) 的类型,因此 f2 的类型)是第一个 lambda 的类型,并且考虑到每个 lambda 都是不同的类型,你不能将第二个 lambda 分配给第一个 lambda 类型的变量。

第二种情况:

std::function<int (int)> f1 = [](int x) {return x;};
decltype(f1) f2 = [](int y) {return y;};

f1 的类型(以及 decltype(f1) 的类型,因此 f2 的类型)是 std::function<int(int)>,这不是第一个或第二个 lambda,但与两者兼容。在两个 lambda 都可以分配给 std::function<int(int)>.

的意义上是兼容的