For variables, specifies that the type of the variable that is being declared will be automatically deduced from its initializer. For functions, specifies that the return type is a trailing return type or will be deduced from its return statements (since C++14) for non-type template parameters, specifies that the type will be deduced from the argument (since C++17).
auto variable initializer | (1) | (since C++11) |
auto function -> return type | (2) | (since C++11) |
auto function | (3) | (since C++14) |
decltype(auto) variable initializer | (4) | (since C++14) |
decltype(auto) function | (5) | (since C++14) |
auto :: | (6) | (concepts TS) |
cv(optional) auto ref(optional) parameter | (7) | (since C++14) |
template < auto Parameter > | (8) | (since C++17) |
cv(optional) auto ref(optional) [ identifier-list ] initializer ; | (9) | (since C++17) |
auto
may be used as the type specifier.auto
using the rules for template argument deduction from a function call (see template argument deduction#Other contexts for details). The keyword auto
may be accompanied by modifiers, such as const
or &
, which will participate in the type deduction. For example, given const auto& i = expr;
, the type of i
is exactly the type of the argument u
in an imaginary template template<class U> void f(const U& u)
if the function call f(expr)
was compiled. Therefore, auto&&
may be deduced either as an lvalue reference or rvalue reference according to the initializer, which is used in range-based for loop.auto
is used to declare multiple variables, the deduced types must match. For example, the declaration auto i = 0, d = 0.0;
is ill-formed, while the declaration auto i = 0, *p = &i;
is well-formed and the auto
is deduced as int
.auto
does not perform automatic type detection. It only serves as a part of the syntax.auto
indicates that the return type will be deduced from the operand of its return statement using the rules for template argument deduction.decltype(auto)
, the keyword auto
is replaced with the expression (or expression list) of its initializer, and the actual type is deduced using the rules for decltype.decltype(auto)
, the keyword auto
is replaced with the operand of its return statement, and the actual return type is deduced using the rules for decltype.auto::
is a placeholder that is replaced by a class or enumeration type following the rules for constrained type placeholder deduction.Until C++11, auto
had the semantic of a storage duration specifier.
Mixing auto
variables and functions in one declaration, as in auto f() -> int, i = 0;
is not allowed.
#include <iostream> #include <utility> template<class T, class U> auto add(T t, U u) { return t + u; } // the return type is the type of operator+(T, U) // perfect forwarding of a function call must use decltype(auto) // in case the function it calls returns by reference template<class F, class... Args> decltype(auto) PerfectForward(F fun, Args&&... args) { return fun(std::forward<Args>(args)...); } template<auto n> // C++17 auto parameter declaration auto f() -> std::pair<decltype(n), decltype(n)> // auto can't deduce from brace-init-list { return {n, n}; } int main() { auto a = 1 + 2; // type of a is int auto b = add(1, 1.2); // type of b is double static_assert(std::is_same_v<decltype(a), int>); static_assert(std::is_same_v<decltype(b), double>); decltype(auto) c1 = a; // type of c1 is int, holding a copy of a decltype(auto) c2 = (a); // type of c2 is int&, an alias of a std::cout << "a, before modification through c2 = " << a << '\n'; ++c2; std::cout << "a, after modification through c2 = " << a << '\n'; auto [v, w] = f<0>(); //structured binding declaration auto d = {1, 2}; // OK: type of d is std::initializer_list<int> auto n = {5}; // OK: type of n is std::initializer_list<int> // auto e{1, 2}; // Error as of C++17, std::initializer_list<int> before auto m{5}; // OK: type of m is int as of C++17, initializer_list<int> before // decltype(auto) z = { 1, 2 } // Error: {1, 2} is not an expression // auto is commonly used for unnamed types such as the types of lambda expressions auto lambda = [](int x) { return x + 3; }; // auto int x; // valid C++98, error as of C++11 // auto x; // valid C, error in C++ }
Possible output:
a, before modification through c2 = 3 a, after modification through c2 = 4
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/language/auto