指定返回类型

对于具有单个 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