# 15 - Auto Keyword

A keyword auto pode ser usada em variáveis e funções.

Uma variável declarada com auto possui tipo, e esse tipo é deduzido a partir do valor que é dado à ela.

Para usar auto durante a declaração de uma variável, essa variável deve ser inicializada para que o tipo possa ser deduzido.

auto a = 10; // o tipo de a é int.

auto b = (int)10; // o mesmo que o de cima, só que de forma explicita.

auto c; // inválido pois o tipo de c não póde ser deduzido.

Em funções com retorno do tipo auto, o tipo do retorno é deduzido através do valor retornado.

auto sum(int a, int b) { return a + b; } // auto é deduzido como int

auto sum(int a, int b) -> int { return a + b + 3.14; } // forçando auto a ser deduzido como int

auto sum(int a, int b) { return a + b + 3.14; } // auto é deduzido como double

Podemos usar parâmetros do tipo auto em lambdas.

#include <iostream>
#include <numeric>  // std::iota e std::accumulate
#include <vector>

auto main() -> int
{
    std::vector<int> array(5);
    std::iota(array.begin(), array.end(), 1);

    auto const factorial = std::accumulate(
        array.begin(),
        array.end(),
        1,
        [](auto accum, auto current) -> int { return accum * current; });

    std::cout << factorial; // 120
}

auto em loops

#include <iostream>
#include <vector>
#include <algorithm>

auto main() -> int
{
    std::vector<int> array(5);
    std::generate(array.begin(), array.end(), [i = 1]() mutable -> int { return i++; });

    for (auto element : array)
    {
        std::cout << element << '\n';
    }
}