Hi, everyone.
After reading the rule of [dcl.type.auto.deduct] section. I wonder Does such the following rule exist a vague, that is:
[dcl.type.auto.deduct]
> A type T containing a placeholder type, and a corresponding initializer E, are determined as follows:
>for a variable declared with a type that contains a placeholder type, T is the declared type of the variable and E is the initializer. If the initialization is direct-list-initialization, the initializer shall be a braced-init-list containing only a single assignment-expression and E is the assignment-expression;
````
auto v0 = 0; // #1
auto v1(0); //#2
````
Please consider the above two declarations, According to the above rule, I think, the initializer of the declaration declared at #1 is `= 0`, and the initializer of the declaration declared at #2 is "(0)", because of the definition of "initializer",
initializer:
>brace-or-equal-initializer
>( expression-list )
Where brace-or-equal-initializer is,
brace-or-equal-initializer:
= initializer-clause
braced-init-list
>If the placeholder-type-specifier is of the form type-constraint<opt> auto, the deduced type T′ replacing T is determined using the rules for template argument deduction. Obtain P from T by replacing the occurrences of type-constraint<opt> auto either with a new invented type template parameter U or, if the initialization is copy-list-initialization, with std::initializer_list<U>. Deduce a value for U using the rules of template argument deduction from a function call, where P is a function template parameter type and the corresponding argument is E. If the deduction fails, the declaration is ill-formed. Otherwise, T′ is obtained by substituting the deduced U into P.
So, how could the initializer such as `= 0`, `(0)` be as an argument? Since there's an adjustment for the case where the initialization is "direct-list-initialization", why does the rule not make a adjustment to cover these cases where the initializer is the form of = initializer-clause or (expression-list) ?
I don't think when `E` is form of `= initializer-clause` or `(expression-list) ` used as argument is the intent of the rule [dcl.type.auto.deduct#2.2]
Maybe change [dcl.type.auto.deduct#2.2] to:
for a variable declared with a type that contains a placeholder type, T is the declared type of the variable and If the initialization is direct-list-initialization, the initializer shall be a braced-init-list containing only a single assignment-expression and E is the assignment-expression; if the initializer has the form `= initializer-clause` or `(expression-list) `, then E is `initializer-clause` or `expression-list` respectively.
I think Only after applying these adjustments for `E` is such the `E` that participates in type placeholder deduction.