指定返回类型
对于具有单个 return 语句的 lambdas,或者其表达式具有相同类型的多个 return 语句,编译器可以推导出返回类型:
// Returns bool, because "value > 10" is a comparison which yields a Boolean result
auto l = [](int value) {
return value > 10;
}
对于具有多个不同类型的 return 语句的 lambda,编译器不能推导出返回类型:
// error: return types must match if lambda has unspecified return type
auto l = [](int value) {
if (value < 10) {
return 1;
} else {
return 1.5;
}
};
在这种情况下,你必须明确指定返回类型:
// The return type is specified explicitly as 'double'
auto l = [](int value) -> double {
if (value < 10) {
return 1;
} else {
return 1.5;
}
};
这个规则匹配 auto
类型演绎的规则。没有显式指定返回类型的 Lambdas 永远不会返回引用,因此如果需要引用类型,则必须明确指定它:
auto copy = [](X& x) { return x; }; // 'copy' returns an X, so copies its input
auto ref = [](X& x) -> X& { return x; }; // 'ref' returns an X&, no copy