我有以下代码:
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漏洞,但这看起来不同.
现在显然这两种类型是相同的,
不,他们不是.每个lambda表达式的类型都是唯一的,不同的类型.
来自[expr.prim.lambda]/3:
的类型的λ-表达(这也是封闭的对象的类型)是一个独特的,无名不愈合类类型-称为闭合类型 -其特性如下所述.
因此,返回类型扣除f
失败并且不会导致 std::function
.后者是一种不相关的库类型,它在某种程度上不是任何闭包类型的"常见类型".
当然,每个唯一的闭包类型都可以转换为std::function
,所以如果你提供返回类型,一切都可以:
auto f = []() -> std::function{ return 1 ? []() { return 1; } : []() { return 2; }; };
或者,作为一个普通的功能:
std::functionf() { return 1 ? []() { return 1; } : []() { return 2; }; }