C++ Especificando el tipo de retorno


Ejemplo

Para las lambdas con una sola declaración de retorno, o múltiples declaraciones de retorno cuyas expresiones son del mismo tipo, el compilador puede deducir el tipo de retorno:

// Returns bool, because "value > 10" is a comparison which yields a Boolean result
auto l = [](int value) {
    return value > 10;
}

Para las lambdas con múltiples declaraciones de retorno de diferentes tipos, el compilador no puede deducir el tipo de devolución:

// error: return types must match if lambda has unspecified return type
auto l = [](int value) {
    if (value < 10) {
        return 1;
    } else {
        return 1.5;
    }
};

En este caso, debe especificar el tipo de retorno explícitamente:

// The return type is specified explicitly as 'double'
auto l = [](int value) -> double {
    if (value < 10) {
        return 1;
    } else {
        return 1.5;
    }
};

Las reglas para esto coinciden con las reglas para auto deducción de auto tipo. Lambdas sin tipos de retorno explícitamente especificados nunca devuelve referencias, por lo que si se desea un tipo de referencia, también debe especificarse explícitamente:

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