5 votes

Pourquoi auto n'est pas autorisé comme argument de fonction ?

De cette question il est clair que auto ne peut pas être utilisé comme argument de fonction. Ma question est de savoir pourquoi le type de retour est autorisé comme auto mais les arguments des fonctions ne le sont pas ?

auto function(auto data)
{
    //DOES something
}

Depuis, Les avantages de la auto arrivée c++1z alors pourquoi pas ceci ?

12voto

Baum mit Augen Points 3571

Cette syntaxe a été proposée dans le Concepts TS, mais n'a pas été intégrée dans C++17 pour des raisons de sécurité. diverses raisons .

Malgré certaines critiques que j'ai exposées ci-dessous, elle a été ajoutée dans C++20.


Remarque : la partie suivante de la réponse a été rendue obsolète par la fusion de la norme P1141R2 dans la norme. Je la laisse ici à titre de référence.

Cependant, même si nous obtenons finalement des concepts dans la prochaine itération (probablement C++20), il n'est pas certain que la syntaxe souhaitée soit intégrée à la norme. Dans cet article Richard Smith et James Dennett critiquent la soi-disant "Notations laconiques sur les modèles" en disant

Le TS Concepts introduit trop de syntaxes pour une déclaration de modèle de fonction. Certaines de ces syntaxes n'ont pas de marqueur syntaxique clair et cohérent pour les modèles, ce qui constitue une information sémantique importante pour le lecteur du code (rappelons que le code est beaucoup plus lu qu'il n'est écrit).

Ils proposent ensuite une syntaxe différente pour atteindre cet objectif, tout en gardant les déclarations de modèles plus cohérentes :

\=> Exiger un sigle explicite pour déclarer qu'une fonction est un modèle.

Remplacer

void f(auto a) {}
template<typename T> void g(auto a) {}

avec

template<...> void f(auto a) {}
template<typename T, ...> void g(auto a) {}

Le ... sigil dans le liste de paramètres de modèle indique que des paramètres supplémentaires du modèle seront déduits de la déclaration.

Alors Tl;dr : Il y a un tas de raisons liées à la procédure de normalisation pour lesquelles nous ne l'avons pas dans C++17, et il y a encore plus de raisons pour lesquelles nous ne l'aurons probablement jamais. Si j'ai bien compris l'article, le point clé est que chaque template devrait être introduit avec une balise template mot-clé.

6voto

tobi303 Points 2932

Il y a déjà une réponse exhaustive, je veux juste ajouter mes deux cents en donnant une réponse plus maniable.....

En général auto ne signifie pas "cela pourrait être n'importe quel type" mais simplement que le compilateur peut déduire le type. Ainsi, les deux auto en

auto function(auto data) {
    //...
    return x;
}

sont très différentes. En voyant cette définition seule, le compilateur peut déduire le type de retour. Par contre, le auto sur le paramètre ne peut pas être déduit à moins que le compilateur voit comment function s'appelle. En outre, il doit y avoir différentes versions de function . Bien qu'il soit presque trivial de déterminer le type de x ce qui fait que le deuxième auto le travail nécessite de tourner function dans un modèle qui nécessite de nouvelles règles et introduit inévitablement de nouvelles bizarreries dans le langage.

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