'auto' as a template argument placeholder for a function parameter

后端 未结 1 357
庸人自扰
庸人自扰 2020-12-17 09:18

C++20 allows using auto for function parameter type.

Does it also allow using auto as a template argument placeholder (not similar, but in t

相关标签:
1条回答
  • 2020-12-17 09:49

    This syntax is valid in the C++ Concepts Technical Specification, but not in C++20. In C++20 concepts, auto is only permitted at the top level in a function parameter type. The relevant rule is [dcl.spec.auto] paragraph 2:

    A placeholder-type-specifier of the form type-constraint[opt] auto can be used as a decl-specifier of the decl-specifier-seq of a parameter-declaration of a function declaration or lambda-expression and, if it is not the auto type-specifier introducing a trailing-return-type (see below), is a generic parameter type placeholder of the function declaration or lambda-expression. [Note: Having a generic parameter type placeholder signifies that the function is an abbreviated function template (9.3.3.5 [dcl.fct]) or the lambda is a generic lambda (7.5.5 [expr.prim.lambda]). —end note]

    (If you check the wording in the most recent working draft at the time of writing, you will find a somewhat different rule. The above rule was modified by core issue 2447, which was voted into the C++20 final draft at the Prague committee meeting a week ago.)

    The decl-specifiers in a function parameter are the initial sequence of keywords and type names at the start of the parameter declaration. The above rule allows auto there at the top level:

    void f(auto x);
    

    ... but only as a decl-specifier. auto is not permitted when nested within a decl-specifier:

    void f(std::vector<auto> x);
    

    ... and is also not permitted elsewhere in the parameter type:

    void f(void (*p)(auto));
    
    0 讨论(0)
提交回复
热议问题