[dcl.type.auto.deduct] (original) (raw)
9 Declarations [dcl]
9.2 Specifiers [dcl.spec]
9.2.9 Type specifiers [dcl.type]
9.2.9.7 Placeholder type specifiers [dcl.spec.auto]
9.2.9.7.2 Placeholder type deduction [dcl.type.auto.deduct]
Placeholder type deductionis the process by which a type containing a placeholder type is replaced by a deduced type.
A type T containing a placeholder type, and a corresponding initializer-clause E, are determined as follows:
- For a non-discarded return statement that occurs in a function declared with a return type that contains a placeholder type,T is the declared return type.
- For a variable declared with a type that contains a placeholder type,T is the declared type of the variable.
- For an explicit type conversion ([expr.type.conv]),T is the specified type, which shall be auto.
- For a constant template parameter declared with a type that contains a placeholder type,T is the declared type of the constant template parameter and E is the corresponding template argument.
T shall not be an array type.
If the placeholder-type-specifier is of the formtype-constraint auto, the deduced type replacing Tis determined using the rules for template argument deduction.
Obtain P fromT by replacing the occurrences oftype-constraint auto either with a new invented type template parameter U or, if the initialization is copy-list-initialization, withstd::initializer_list<U>.
If the deduction fails, the declaration is ill-formed.
Otherwise, is obtained by substituting the deduced U into P.
[Example 1: auto x1 = { 1, 2 }; auto x2 = { 1, 2.0 }; auto x3{ 1, 2 }; auto x4 = { 3 }; auto x5{ 3 }; — _end example_]
[Example 2: const auto &i = expr;
The type of i is the deduced type of the parameter u in the call f(expr) of the following invented function template:template <class U> void f(const U& u);
— _end example_]
The type deduced for T is determined as described in [dcl.type.decltype], as thoughE had been the operand of the decltype.
[Example 3: int i;int&& f();auto x2a(i); decltype(auto) x2d(i); auto x3a = i; decltype(auto) x3d = i; auto x4a = (i); decltype(auto) x4d = (i); auto x5a = f(); decltype(auto) x5d = f(); auto x6a = { 1, 2 }; decltype(auto) x6d = { 1, 2 }; auto *x7a = &i; decltype(auto)*x7d = &i; auto f1(int x) -> decltype((x)) { return (x); } auto f2(int x) -> decltype(auto) { return (x); } — _end example_]