web-dev-qa-db-fra.com

liaison structurée avec [[peut-être_unused]]

Les langages fonctionnels avec correspondance de modèle (parfois?) Ont la possibilité d'ignorer certaines valeurs liées, mais avec les liaisons structurées C++ 17, il semble qu'il n'y ait aucun moyen de le faire ( std :: ignore avec les liaisons structurées? =). Le conseil est d'utiliser un nom fictif, mais nous recevrons ensuite des avertissements sur les variables inutilisées.

Avec les dernières têtes de clang et de gcc, cela fait la chose attendue, qui est agréable et utile,

[[maybe_unused]] auto x =4 ; // fine, no warning
[[maybe_unused]] auto [a,dummyb,dummyc] = std::Tuple<int,int,float>(1,1,1.0f); 

mais j'aurais aussi espéré que cela fonctionnerait:

auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] =
      std::Tuple<int,int,float>(1,1,1.0f);

y a-t-il une raison spécifique attributs ne peut pas être utilisé ici? (dans la norme aussi bien que techniquement). Ni gcc ni clang ne l'acceptent.


Modifier, collecter l'état du support: (merci à godbolt/compiler Explorer ). Cela fonctionne comme prévu dans (pourrait être plus tôt aussi):

  • tronc gcc 8.0 (expérimental g ++ 8.0.0 20171015)
  • clang 4.0.0
  • icc 18 (non testé, selon spécifications )
  • msvc 19.22 (probablement plus tôt) (corrigé, selon rapport de bogue )

Essayez-le dans godbolt à https://gcc.godbolt.org/z/H2duYd

41
Johan Lundberg

Dans le papier des reliures de la structure:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0144r2.pdf

ils discutent de leur raisonnement:

3.8 Devrait-il y avoir un moyen d'ignorer explicitement les composants?

La motivation serait de faire taire les avertissements du compilateur sur les noms inutilisés.

Nous pensons que la réponse devrait être "pas encore". Ceci n'est pas motivé par des cas d'utilisation (faire taire les avertissements du compilateur est une motivation, mais ce n'est pas un cas d'utilisation en soi), et il vaut mieux le laisser jusqu'à ce que nous puissions le réexaminer dans le contexte d'une proposition de correspondance de modèle plus générale où cela devrait tomber. comme cas particulier.

La symétrie avec std :: tie suggère d'utiliser quelque chose comme std :: ignore:

   Tuple<T1,T2,T3> f(); 
   auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element 

Cependant, cela semble gênant.

Anticiper la correspondance de motifs dans le langage pourrait suggérer un caractère générique comme _ ou *, mais comme nous n'avons pas encore de correspondance de motifs, il est prématuré de choisir une syntaxe que nous savons compatible. Il s'agit d'une pure extension qui peut attendre d'être prise en compte avec la correspondance de modèles.

Bien que cela ne traite pas explicitement de [[maybe_unused]], Je suppose que le raisonnement pourrait être le même. L'arrêt des avertissements du compilateur n'est pas un cas d'utilisation.

23
Mikel F

En tant que résolution pour CWG 236 , le projet de travail de la norme a obtenu la formulation suivante ( [dcl.attr.unused] ):

  1. L'attribut peut être appliqué à la déclaration d'une classe, un typedef-nom , une variable (y compris une déclaration de liaison structurée), une donnée non statique membre, une fonction, une énumération ou un énumérateur.

  2. Pour une entité marquée maybe_unused, les implémentations ne devraient pas émettre un avertissement indiquant que l'entité ou ses liaisons structurées (le cas échéant) sont utilisées ou inutilisées. Pour une déclaration contraignante structurée non marquée maybe_unused, les implémentations ne devraient pas émettre un tel avertissement à moins que toutes ses liaisons structurées ne soient pas utilisées.

Les déclarations structurées de liaison n'étaient auparavant pas explicitement mentionnées.

8
metalfox