Consider using auto as a placeholder for the actual type in the following situations:
- To declare local variables with the form auto name = expression when you do not want to commit to a specific type:
auto i = 42; // int
auto d = 42.5; // double
auto s = "text"; // char const *
auto v = { 1, 2, 3 }; // std::initializer_list<int>
- To declare local variables with the auto name = type-id { expression } form when you need to commit to a specific type:
auto b = new char[10]{ 0 }; // char*
auto s1 = std::string {"text"}; // std::string
auto v1 = std::vector<int> { 1, 2, 3 }; // std::vector<int>
auto p = std::make_shared<int>(42); // std::shared_ptr<int>
- To declare named lambda functions, with the form auto name = lambda-expression, unless the lambda needs to be passed or return to a function:
auto upper = [](char const c) {return toupper(c); };
- To declare lambda parameters and return values:
auto add = [](auto const a, auto const b) {return a + b;};
- To declare function return type when you don't want to commit to a specific type:
template <typename F, typename T>
auto apply(F&& f, T value)
{
return f(value);
}