C++ Specifica del tipo di reso


Esempio

Per lambdas con una sola istruzione return, o più istruzioni return le cui espressioni sono dello stesso tipo, il compilatore può dedurre il tipo restituito:

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

Per lambda con più dichiarazioni di ritorno di tipi diversi , il compilatore non può dedurre il tipo di reso:

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

In questo caso devi specificare esplicitamente il tipo di reso:

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

Le regole per questo corrispondono alle regole per auto deduzione del tipo auto . Lambdas senza tipi di ritorno specificati in modo esplicito non restituisce mai riferimenti, quindi se si desidera un tipo di riferimento deve essere specificato esplicitamente:

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