43 votes

Les paramètres de gabarit non typés en c++17 peuvent-ils être decltype(auto) ?

J'ai découvert que gcc et clang autorisent l'utilisation de decltype(auto) dans une clause de type de paramètre de modèle non-type. Par exemple :

template <decltype(auto)>
struct X {};

int foo ;

int main() {
    X<(foo)> x;
    static_cast<void>(x);
}

[live demo gcc] [live demo clang]

S'agit-il d'une fonctionnalité standard ou d'une extension gnu ?

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.

32voto

StoryTeller Points 6139

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X