Ale*_*lex 8 c++ lambda return-type return-type-deduction c++14
我有以下代码:
int main() {
auto f = [] {
if (1) return [] { return 1; };
else return [] { return 2; };
};
return f()();
}
Run Code Online (Sandbox Code Playgroud)
使用GCC 5.2.1引发以下编译器错误:
error: inconsistent types ‘main()::<lambda()>::<lambda()>’ and
‘main()::<lambda()>::<lambda()>’ deduced for lambda
return type else return [] { return 2; };
Run Code Online (Sandbox Code Playgroud)
现在显然这两种类型看起来是一样的,所以我不确定这是否是带有误导性错误消息的GCC,或者它是否真的是一个错误.根据我的知识,这应该编译; lambda返回类型应推断为std::function<int()>.有趣的是,如果我预先声明lambda返回并返回相同的变量两次,它就可以工作.
任何人都可以对发生的事情有所了解吗?我发现了类似的问题,很多都归因于GCC漏洞,但这看起来不同.
Ker*_* SB 13
现在显然这两种类型是相同的,
不,他们不是.每个lambda表达式的类型都是唯一的,不同的类型.
来自[expr.prim.lambda]/3:
的类型的λ-表达(这也是封闭的对象的类型)是一个独特的,无名不愈合类类型-称为闭合类型 -其特性如下所述.
因此,返回类型扣除f 失败并且不会导致 std::function<int()>.后者是一种不相关的库类型,它在某种程度上不是任何闭包类型的"常见类型".
当然,每个唯一的闭包类型都可以转换为std::function<int()>,所以如果你提供返回类型,一切都可以:
auto f = []() -> std::function<int()> {
return 1 ? []() { return 1; }
: []() { return 2; };
};
Run Code Online (Sandbox Code Playgroud)
或者,作为一个普通的功能:
std::function<int()> f() {
return 1 ? []() { return 1; }
: []() { return 2; };
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1473 次 |
| 最近记录: |