|
1 | | -# 14 - Auto Keyword |
| 1 | +# 14 - Auto Keyword |
| 2 | + |
| 3 | +A keyword `auto` pode ser usada em variáveis e funções. |
| 4 | + |
| 5 | +Uma variável declarada com auto possui tipo, e esse tipo é deduzido a partir do valor que é dado à ela. |
| 6 | + |
| 7 | +Para usar auto durante a declaração de uma variável, essa variável deve ser inicializada para que o tipo possa ser |
| 8 | +deduzido. |
| 9 | + |
| 10 | +```cpp |
| 11 | +auto a = 10; // o tipo de a é int. |
| 12 | + |
| 13 | +auto b = (int)10; // o mesmo que o de cima, só que de forma explicita. |
| 14 | + |
| 15 | +auto c; // inválido pois o tipo de c não póde ser deduzido. |
| 16 | +``` |
| 17 | + |
| 18 | +Em funções com retorno do tipo auto, o tipo do retorno é deduzido através do valor retornado. |
| 19 | + |
| 20 | +```cpp |
| 21 | +auto sum(int a, int b) { return a + b; } // auto é deduzido como int |
| 22 | + |
| 23 | +auto sum(int a, int b) -> int { return a + b + 3.14; } // forçando auto a ser deduzido como int |
| 24 | + |
| 25 | +auto sum(int a, int b) { return a + b + 3.14; } // auto é deduzido como double |
| 26 | +``` |
| 27 | +
|
| 28 | +Podemos usar parâmetros do tipo `auto` em lambdas. |
| 29 | +
|
| 30 | +```cpp |
| 31 | +#include <iostream> |
| 32 | +#include <numeric> // std::iota e std::accumulate |
| 33 | +#include <vector> |
| 34 | +
|
| 35 | +auto main() -> int |
| 36 | +{ |
| 37 | + std::vector<int> array(5); |
| 38 | + std::iota(array.begin(), array.end(), 1); |
| 39 | +
|
| 40 | + auto const factorial = std::accumulate( |
| 41 | + array.begin(), |
| 42 | + array.end(), |
| 43 | + 1, |
| 44 | + [](auto accum, auto current) -> int { return accum * current; }); |
| 45 | +
|
| 46 | + std::cout << factorial; // 120 |
| 47 | +} |
| 48 | +``` |
| 49 | + |
| 50 | +`auto` em loops |
| 51 | + |
| 52 | +```cpp |
| 53 | +#include <iostream> |
| 54 | +#include <vector> |
| 55 | +#include <algorithm> |
| 56 | + |
| 57 | +auto main() -> int |
| 58 | +{ |
| 59 | + std::vector<int> array(5); |
| 60 | + std::generate(array.begin(), array.end(), [i = 1]() mutable -> int { return i++; }); |
| 61 | + |
| 62 | + for (auto element : array) |
| 63 | + { |
| 64 | + std::cout << element << '\n'; |
| 65 | + } |
| 66 | +} |
| 67 | +``` |
0 commit comments