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)>
.
的意义上是兼容的
我正在尝试理解为什么这段代码无法编译:
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)>
.