web-dev-qa-db-fra.com

std :: ignore avec des liaisons structurées?

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?

55
jotik

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 un 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 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 usages std::ignore.

39
metalfox

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.

6
Nicol Bolas