当前位置:  开发笔记 > 编程语言 > 正文

为什么我得到一个带有多个返回路径的lambda返回lambda的类型推导错误?

如何解决《为什么我得到一个带有多个返回路径的lambda返回lambda的类型推导错误?》经验,为你挑选了1个好方法。

我有以下代码:

int main() {
    auto f = [] {
        if (1) return [] { return 1; };
        else return [] { return 2; };
    };
    return f()();
}

使用GCC 5.2.1引发以下编译器错误:

error: inconsistent types ‘main()::::’ and 
       ‘main()::::’ deduced for lambda 
       return type else return [] { return 2; };

现在显然这两种类型看起来是一样的,所以我不确定这是否是带有误导性错误消息的GCC,或者它是否真的是一个错误.根据我的知识,这应该编译; lambda返回类型应推断为std::function.有趣的是,如果我预先声明lambda返回并返回相同的变量两次,它就可以工作.

任何人都可以对发生的事情有所了解吗?我发现了类似的问题,很多都归因于GCC漏洞,但这看起来不同.



1> Kerrek SB..:

现在显然这两种类型是相同的,

不,他们不是.每个lambda表达式的类型都是唯一的,不同的类型.

来自[expr.prim.lambda]/3:

的类型的λ-表达(这也是封闭的对象的类型)是一个独特的,无名不愈合类类型-称为闭合类型 -其特性如下所述.

因此,返回类型扣除f 失败并且不会导致 std::function.后者是一种不相关的库类型,它在某种程度上不是任何闭包类型的"常见类型".

当然,每个唯一的闭包类型都可以转换std::function,所以如果你提供返回类型,一切都可以:

auto f = []() -> std::function {
    return 1 ? []() { return 1; }
             : []() { return 2; };
};

或者,作为一个普通的功能:

std::function f() {
    return 1 ? []() { return 1; }
             : []() { return 2; };
}


@Alex:考虑`auto f = []()mutable {static int n = 0; return ++ n; }`.你想要在碰巧键入相同lambda的每个人之间共享`n`吗?
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有