C'est la norme. D'abord, pour un paramètre de modèle non-type :
[temp.param/4]
Un paramètre de modèle non-type doit avoir l'un des types suivants types (éventuellement qualifiés de cv) suivants :
- ...
- un type qui contient un type d'espace libre .
Lorsque les types de caractères génériques ont les caractéristiques suivantes :
[dcl.spec.auto/1]
Les spécificateurs de types auto et decltype(auto) sont utilisés pour désigner un type type générique qui sera remplacé plus tard par la déduction d'un initialisateur. Le spécificateur de type auto est également utilisé pour introduire un type de fonction ayant un type de retour de traînée ou pour signifier qu'un lambda est un lambda générique ([expr.prim.lambda.closure]). Le spécificateur de type auto est également utilisé pour introduire une déclaration de liaison structurée. déclaration.
[dcl.spec.auto/5]
On peut également utiliser un type de placeholder dans le type-specifier-seq dans le new-type-id ou type-id d'une new-expression et en tant que décl-spécificateur de la decl-specifier-seq de la déclaration de paramètre dans un paramètre-type.
Puisque la puce ci-dessus indique "type placeholder", et qu'un tel type peut être désigné soit par auto
o decltype(auto)
les deux compilateurs sont corrects.
11 votes
C'est la raison pour laquelle je me couche tard sur le SO. C'est grâce à ces questions que j'apprends moi-même à mieux connaître la langue :)
8 votes
@StoryTeller J'admets que, du moins pour moi, le c++ est encore plein de surprises :)
1 votes
Très bonne question. +1 Et, @StoryTeller : Je suis tout à fait d'accord avec vous.
1 votes
(foo)
se déduit comme suitint &
qui est connu au moment de la compilation commefoo
est une variable globale (avec une durée de stockage statique). Je n'ai pas réalisé au début ce qui se passait ici.