Partage
  • Partager sur Facebook
  • Partager sur Twitter

auto comme argument de fonction

Sujet résolu
17 août 2018 à 2:09:38

Bonjour,

Je sais que les lambdas le supportent, je sais que l'on peut faire sans. 

Néanmoins, j'ai vu gbdivers l'écrire dans un post précédent, mais je ne trouve aucun papier proposant de mettre auto comme argument d'une fonction :

#include <iostream>

void f(auto a) {
    std::cout << a << std::endl;
}

int main() {
    f(5);
    f(5.0);
    return 0;
}

Clang refuse complètement ce code là, en revenche gcc l'accepte avec le warning comme quoi il faut activer -fconcepts. Faut il attendre que la norme du C++20 soit finalisé pour que ce genre de code soit légal (et qu'on aille pas en prison). Est ce que ça a un rapport avec les concepts (il nous les faut le plus rapidement possible ces machins là).

  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
17 août 2018 à 4:41:08

-fconcepts correpond effectivement aux concepts de c++20. Actuellement, seul gcc propose une implémentation qui n'est pas forcement à jour par rapport au standard.

Je n'ai pas souvenir de l'avoir vu en paramètre de fonction, mais c'est une attente logique: il y a auto avec lambda, il y auto pour les valeurs de template, donc on s'attend aussi à l'avoir pour les fonctions. D'ailleurs, dans la forme simple, les concepts se substituent au type dans la déclaration des variable et auto est le concept le moins restrictive.

  • Partager sur Facebook
  • Partager sur Twitter
17 août 2018 à 9:04:49

Cf https://en.cppreference.com/w/cpp/experimental/constraints#Abbreviated_templates 

C'est effectivement une sorte de concept sans concept. Un concept qui n'impose pas de contrainte sur le type. Cela remplace un template anonyme.

void f1(auto a, auto* b);
// long form: template<typename T, typename U> f1(T a, U* b);

En pratique, c'est du typage faible. C'est un remplaçant de void* ou std::any dans le principe. Très probablement qu'aucune fonction n'accepte TOUS les types. Il est fort possible que dans les recommandations, l'utilisation de auto soit déconseillé. (Dans le cas des fonctions lambdas, utiliser auto en paramètre est moins grave, puisqu'elles sont sensées avoir une faible portée)

  • Partager sur Facebook
  • Partager sur Twitter