lambda尾随返​​回类型auto的用法是什么?

时间:2018-08-29 12:11:16

标签: c++ lambda c++14 language-lawyer trailing-return-type

apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'realm-android' android { //bla bla bla } configurations { compile.exclude group: 'androidx.annotation', module: 'annotation' } dependencies { // bla bla bla } 中添加-> auto有什么用?

对我来说-与[]() -> auto { return 4; }没什么不同

1 个答案:

答案 0 :(得分:19)

默认为auto。标准[expr.prim.lambda]/4的内容如下:

  

如果 lambda-expression 不包含 lambda-declarator ,则好像 lambda-declarator 是{{1} }。 lambda返回类型为(),如果由auto语句提供和/或推导,则由 trailing-return-type 替换,如[dcl.spec.auto ]。

我的加成。

因此,return本身没有用。但是,我们可以使用-> auto形成其他返回类型,即:auto-> auto&-> const auto&-> auto&&。适用归还类型扣除的标准rules。应该记住,-> decltype(auto)永远不会推论为引用类型,因此默认情况下,lambda返回非引用类型。

一些(平凡的)例子:

auto

PiotrNycz的补充。如评论中所指出(@StoryTeller的信用)-实际用法是带有// 1. int foo(int); int& foo(char); int x; auto lambda1 = [](auto& x) { return x; }; static_assert(std::is_same_v<decltype(lambda1(x)), int>); auto lambda2 = [](auto& x) -> auto& { return x; }; static_assert(std::is_same_v<decltype(lambda2(x)), int&>); // 2. auto lambda3 = [](auto x) { return foo(x); }; static_assert(std::is_same_v<decltype(lambda3(1)), int>); static_assert(std::is_same_v<decltype(lambda3('a')), int>); auto lambda4 = [](auto x) -> decltype(auto) { return foo(x); }; static_assert(std::is_same_v<decltype(lambda4(1)), int>); static_assert(std::is_same_v<decltype(lambda4('a')), int&>); // 3. auto lambda5 = [](auto&& x) -> auto&& { return std::forward<decltype(x)>(x); }; static_assert(std::is_same_v<decltype(lambda5(x)), int&>); static_assert(std::is_same_v<decltype(lambda5(foo(1))), int&&>); static_assert(std::is_same_v<decltype(lambda5(foo('a'))), int&>); auto&的版本,“简并的情况并非如此值得向后弯腰的东西。”

请参阅:

const auto&