在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; }
没什么不同
答案 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&