Prélude:
std::Tuple<int, int, int> f();
std::Tuple<int, int, float, int> g();
C++ 1z introduira une syntaxe pour les liaisons structurées qui permettra d'écrire au lieu de
int a, b, c;
std::tie(a, b, c) = f();
quelque chose comme
auto [a, b, c] = f();
Toutefois, std::tie
également autorisé à spécifier std::ignore
pour ignorer certains composants, par exemple:
std::tie(a, b, std::ignore, c) = g();
Sera-t-il possible de faire quelque chose de similaire en utilisant la nouvelle syntaxe des liaisons structurées? Comment cela fonctionnerait-il?
La proposition de liaisons structurées contient une section dédiée répondant à votre question ( P0144R2 ):
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 les cas d'utilisation (mettre en sourdine les avertissements du compilateur est une motivation, mais ce n'est pas un cas d'utilisation en soi), et il vaut mieux laisser jusqu'à ce que nous puissions le réexaminer dans le contexte de une proposition d'appariement de motifs plus générale où cela devrait se présenter comme un cas spécial.
Symétrie avec
std::tie
suggérerait d'utiliser quelque chose comme unstd::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 des motifs dans la langue 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 dont nous savons qu'elle sera compatible. Il s'agit d'une pure extension qui peut attendre d'être prise en compte avec la correspondance de modèles.
Cependant, notez que le projet de travail de la norme est actuellement en cours de révision par les organismes nationaux compétents (NB), et il y a un NB commentaire demandant cette fonctionnalité ( P0488R , US100):
Les déclarations de décomposition doivent fournir une syntaxe pour supprimer certaines des valeurs renvoyées, tout comme
std::tie
les usagesstd::ignore
.
Sera-t-il possible de faire quelque chose de similaire en utilisant la nouvelle syntaxe des liaisons structurées?
Non. Il vous suffira de créer un nom de variable qui ne sera pas mentionné plus tard.