指定返回型別

對於具有單個 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