【问题标题】:c++ lambda auto type deduction [duplicate]c ++ lambda自动类型推导[重复]
【发布时间】:2020-10-08 21:38:06
【问题描述】:

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

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

这是我得到的编译错误:

错误:要求从 'test_fff()::' 转换为非标量类型 'test_fff()::' 177 | decltype(f1) f2 = [](int y) -> int {return y;};

我正在使用带有 -std=c++17 的 g++ 10.2.0

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

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

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

两者有什么区别?

【问题讨论】:

标签: c++ lambda auto


【解决方案1】:

两者有什么区别?

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

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&lt;int(int)&gt;,这不是第一个或第二个 lambda 的类型,但与两者兼容。在两个 lambda 表达式都可以分配给 std::function&lt;int(int)&gt; 的意义上是兼容的。

【讨论】:

    猜你喜欢
    • 2023-02-23
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多